linux下添加簡單的開機自啟動腳本
在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並鏈接到自啟動程序當中。
還是以diodon軟件來舉例,我編輯一個運行diodon的腳本:
#!/bin/bash
./usr/bin/diodon
將其命名為diodon.sh,並用指令:
chmod +x diodon.sh
sudo cp diodon.sh /etc/init.d/
將文件放到/etc/init.d目錄中,然后將diodon,sh腳本鏈接到開機運行序列中:
cd /etc/init.d
sudo update-rc.d diodon.sh defaults 96
insserv: warning: script 'diodon' missing LSB tags and overrides
這樣重新啟動時,就可以看到diodon.sh正在運行了。
sudo update-rc.d diodon.sh defaults 96
在這條指令中,update-rc.d是一個系統的鏈接工具。
而defaults 96則是指定了腳本的開機順序,數字為0-99,數字越大執行優先級越低,用戶添加的程序最好選擇低優先級的執行順序,因為很可能我們的用戶程序會依賴一些系統的應用進程,例如如果應用程序要使用到網絡部分,就先得讓網絡后台程序先初始化完畢。
看到這里,細心的朋友已經發現了,在鏈接腳本時有一個警告:
insserv: warning: script 'diodon' missing LSB tags and overrides
作為一個菜鳥而言,是不敢忽視任何警告的,所以只好求助google,解決辦法是在自己的腳本中的#!/bin/bash下添加:
### BEGIN INIT INFO
# Provides: downey
# Required-Start: $local_fs $network
# Required-Stop: $local_fs
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: tomcat service
# Description: tomcat service daemon
### END INIT INFO
添加這些的目的是告訴系統一些關於這個啟動腳本的具體信息,其中比較重要的有這幾項:
# Required-Start: 運行這個腳本需要的環境
# Required-Start: 停止這個腳本需要的環境
# Default-Start: 提供運行的運行級別
# Default-Stop: 不運行的運行級別
# Description: 描述
關於linux下的運行級別參考:linux運行級別
刪除用戶進程
既然有添加就必然有刪除,如果需要刪除自定義開機運行腳本,輸入:
sudo update-rc.d -f diodon remove
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中不在有運行級別概念,但是這里權當這么理解。
如果有多項,用逗號作為分隔。
好了,關於linux開機自啟動腳本就到此為止啦,如果朋友們對於這個有什么疑問或者發現有文章中有什么錯誤,歡迎留言
原創博客,轉載請注明出處!
祝各位早日實現項目叢中過,bug不沾身.
