在linux的使用過程中,我們經常會碰到需要將某個自定義的應用程序設置為開機自啟動以節省操作時間,這里提供兩個設置開機自啟動的方法。
注:博主使用的ubuntu-16.04進行實驗,其它版本可能有偏差,但實現原理類似。
rc.local
在rc.local腳本中添加開機自啟動程序
ubuntu在開機過程之后,會執行/etc/rc.local(注意/etc/init.d中也有個rc.local,不要弄混了)文件中的腳本程序,初始情況下,這個文件內容是這樣的:
downey@ubuntu:~$ cat /etc/rc.local #!/bin/sh -e # # rc.local # # This script is executed at the end of each multiuser runlevel. # Make sure that the script will "exit 0" on success or any other # value on error. # # In order to enable or disable this script just change the execution # bits. # # By default this script does nothing.
並不包含其它內容,用戶可以在里面添加需要開機執行的腳本命令,這里以diodon粘貼板工具為例,如果我要開機運行diodon進程,在文本中添加:
downey@ubuntu:~$ cat /etc/rc.local #!/bin/sh -e # # rc.local # # This script is executed at the end of each multiuser runlevel. # Make sure that the script will "exit 0" on success or any other # value on error. # # In order to enable or disable this script just change the execution # bits. # # By default this script does nothing. ./usr/bin/diodon & exit 0
看到這里有些盆友就要問了,為什么要在執行命令后面加&?
在shell執行命令后加&是為了讓應用程序在后台運行,rc.local也是一個腳本,主進程在運行這個腳本時必須能夠返回,如果在這個腳本里面執行了一些死循環或者其他無法返回的任務,整個系統就很可能卡死在這里,無法啟動,所以在這里運行的用戶程序必須是能夠返回或者本身就使用一些后台運行的進程。
經過上面的添加,在下次重啟的時候,使用命令:
downey@ubuntu:~$ ps -ef |grep "diodon" downey 2097 1880 0 22:53 ? 00:00:04 diodon downey 2937 2842 0 23:27 pts/2 00:00:00 grep --color=auto diodon
就可以看到diodon進程已經在后台運行。
刪除
既然有添加,就必須得有刪除,其實以rc.local的刪除方式很簡單,直接刪除rc.local中用戶添加的部分即可。
需要提醒的是,在操作系統文件時,做備份是非常必要的
將用戶腳本添加到/etc/init.d中
添加用戶進程
第二種方式就是將自己的用戶腳本添加到/etc/init.d並鏈接到自啟動程序當中。
還是以tomcat服務來舉例,我編輯一個運行tomcat的腳本:
#!/bin/bash # # tomcat startup script for the Tomcat server # # # chkconfig: 345 80 20 # description: start the tomcat deamon # # Source function library . /etc/rc.d/init.d/functions prog=tomcat8 JAVA_HOME=/www/server/jdk1.8.0_291/ # 根據自己的路徑改寫JAVA_HOME export JAVA_HOME CATALANA_HOME=/www/server/tomcat8/ # 根據自己的路徑改寫CATALANA_HOME export CATALINA_HOME case "$1" in start) echo "Starting Tomcat..." $CATALANA_HOME/bin/startup.sh ;; stop) echo "Stopping Tomcat..." $CATALANA_HOME/bin/shutdown.sh ;; restart) echo "Stopping Tomcat..." $CATALANA_HOME/bin/shutdown.sh sleep 2 echo echo "Starting Tomcat..." $CATALANA_HOME/bin/startup.sh ;; *) echo "Usage: $prog {start|stop|restart}" ;; esac exit 0
將其命名為tomcat,並用指令:
chmod +x tomcat #加執行權限(也可復制到/etc/init.d/目錄后添加) sudo cp tomcat /etc/init.d/
將文件放到/etc/init.d目錄中,然后將tomcat腳本鏈接到開機運行序列中:
chkconfig --add tomcat #添加到開機啟動
chkconfig --del tomcat #移除開機啟動列表
chkconfig #查看開機啟動
#更多chkconfig命令和開機啟動級別 可以自行搜索
systemd的開機自啟動
上面提到的兩種方式適用於經典的system V控制系統啟動和關閉的情況,但是目前(2018年10月)在大多數發行版上都開始使用了systemd的系統軟件控制方式,包括Ubuntu16,centos.systemd系統管理着linux下的進程運行,屬於應用程序,不屬於linux內核的范疇。
在systemd系統上設置開機自啟動的方式也是非常簡單的(盡管systemd這套軟件管理工具並不簡單)。
確定系統是否應用了systemd工具來管理
這里要注意的是,systemd是linux發行版上的預裝工具,用來管理系統軟件的啟動運行和結束,所以通常來說,這套東西是依賴於發行版的,如果系統使用了這一套工具,那么就可以使用它來管理進程,如果不是,即使你安裝了它,它也不會被默認配置為系統管理工具。
查看系統是否使用systemd工具我們可以使用如下的指令:
systemd --version
如果系統返回如下類似的信息,表明該系統是由systemd工具來管理軟件:
systemd 232
+PAM +AUDIT +SELINUX +IMA +APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ +LZ4 +SECCOMP +BLKID +ELFUTILS +KMOD +IDN
systemctl的使用
對軟件的管理主要是同通過systemd工具中的systemctl命令,相比於之前的system V的控制方式,systemd顯得更加簡潔明了,對用戶更加友好,拿httpd來舉例:
開啟httpd服務: sudo systemctl start httpd 設置httpd服務自啟動: sudo systemctl enable httpd
至於關閉和取消自啟動,大家心里應該有數了吧。
設置開機自啟動
我們再回到重點,設置開機自啟動。
我們要為目標設置一個配置文件,其實這是可以預想到的,linux作為一個復雜的系統,開機自啟動涉及到的依賴、運行級別、運行環境等等問題肯定需要用戶去指定,在啟動的時候系統才知道怎么正確地去運行軟件。這個配置文件固定以.service作為后綴,比如我們如果要運行/home/downey目錄下的test.sh腳本,我們可以添加一個配置文件test.service:
[Unit] Description= Documentation= After=network.target Wants= Requires= [Service] ExecStart=/home/downey/test.sh ExecStop= ExecReload=/home/downey/test.sh Type=simple [Install] WantedBy=multi-user.target
將文件放在/usr/lib/systemd/system 或者 /etc/systemd/system目錄下,然后可以測試一下:
sudo systemctl start test.service
然后你可以查看你的/home/downey/test.sh腳本是否已經運行,如果已經運行表示配置文件沒有問題。然后可以鍵入:
sudo systemctl enable test.service
設置test腳本開機啟動。如果上一步沒有出問題,這一步基本上也不會有什么問題,系統會打印出如下信息:
Created symlink /etc/systemd/system/multi-user.target.wants/test.service → /usr/lib/systemd/system/test.service.
可以看到,這里在/etc/systemd/system/multi-user.target.wants/目錄下創建了一個/usr/lib/systemd/system/test.service文件的軟鏈接,到這里設置開機自啟動就完成了。
配置文件的簡單解析
在上面的配置文件中,為了演示起見,我將一些本測試腳本不需要但是比較重要的配置項也寫了出來,其實如果不需要可以刪除,但是[Unit]/[Service]/[Install]這三個標簽需要保留。
我們來一個個簡單介紹一下配置項:
Description:運行軟件描述
Documentation:軟件的文檔
After:因為軟件的啟動通常依賴於其他軟件,這里是指定在哪個服務被啟動之后再啟動,設置優先級
Wants:弱依賴於某個服務,目標服務的運行狀態可以影響到本軟件但不會決定本軟件運行狀態
Requires:強依賴某個服務,目標服務的狀態可以決定本軟件運行。
ExecStart:執行命令
ExecStop:停止執行命令
ExecReload:重啟時的命令
Type:軟件運行方式,默認為simple
WantedBy:這里相當於設置軟件,選擇運行在linux的哪個運行級別,只是在systemd中不在有運行級別概念,但是這里權當這么理解。
如果有多項,用逗號作為分隔。
轉 : https://www.cnblogs.com/downey-blog/p/10473939.html