使用過程中,為了方便使用,有一些程序需要開機時自啟動應用,下面將介紹一下ubuntu16.04下程序的開機自啟動設置方法。
1 建立一個可執行程序的運行腳本如 keepalive.sh。內部寫入要執行的程序等邏輯腳本, 內容如:
#!/bin/bash
# -*- coding: utf-8 -*-
cmd=$(pgrep -c recogFaceC)
export ACE_ROOT=/home/ubuntu/system-setup/wwei/ACE_wrappers
export THID_ONLY_DEEP_FEATURE=1
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ACE_ROOT/ace
export GOPATH=/home/ubuntu/go
if [[ $cmd -lt 1 ]]
then
nohup /home/ubuntu/system-setup/baic/baicmotor/connection/recogFaceConnection > /tmp/serial.log 2>&1 &
fi
cmdface=$(pgrep -c TFaceRecogS)
if [[ $cmdface -lt 1 ]]
then
nohup /home/ubuntu/system-setup/baic/0411/bin/TFaceRecogService > /tmp/face.log 2>&1 &
fi
以上內容是分別啟動了兩個程序recogFaceConnection TFaceRecogService 並在tmp下分別打印了兩個日志serial.log face.log。 if [[ $cmd -lt 1 ]] 為啟動個數小於1 去啟動程序
環境變量根據實際依賴的配置的環境變量復制粘貼到此處, 程序名稱和運行路徑根據實際情況修改。
2 啟動程序腳本寫完后,需要將此添加到開機啟動項里邊,有以下兩種方法:
(一) 比較簡單的方法
在/etc/rc.local中添加
如果不想將腳本粘來粘去,或創建鏈接什么的,
則:
step1. 先修改好腳本,使其所有模塊都能在任意目錄啟動時正常執行;
step2. 再在/etc/rc.local的末尾添加一行以絕對路徑啟動腳本的行;
如:
$ vim /etc/rc.local
#!/bin/sh
#
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don't
# want to do the full Sys V style init stuff.
touch /var/lock/subsys/local
. /etc/rc.d/rc.tune
/home/ubuntu/keepalive.sh
保存並退出;
再重啟動測試下,則在其它的程序都啟動完成后,將啟動腳本;
此方法程序啟動較慢,需要系統其他啟動完后最后啟動該腳本。因為rc.local 為系統啟動完成才執行的腳本。對啟動時間沒有特殊的要求可以采用此方法。
(二)可設定啟動優先級的高級自啟動設置
上邊一方法介紹了rc.local中添加的方法,rc.local為系統及的腳本,可以參照此寫自己腳本,並設置優先級。
(1)將/etc/rc.local 復制一份如rc.hisign,將內容修改為自己的執行腳本。內容如下:
#!/bin/sh -e
/home/ubuntu/keepalive.sh &
exit 0
注意一定要加&符號。
/etc/下面有這么幾個目錄值得注意:
rcS.d rc0.d rc1.d ... rc6.d ,
(0,1... 6 代表啟動級別 0代表停止,1代表單用戶模式,2-5代表多用戶模式,6代表重啟) 啟動順序從小到大。數字小的優先執行啟動
(它們的作用就相當於 redhat 下的 rc.d ,你可以把腳本放到 rcS.d,然后修改文件名,給它一個啟動序號,如:S88rc.hisign.)
最好的辦法是將腳本放到相應的啟動級別下面, 下面步驟為具體方法
(2)進入/etc/init.d 下,將此下的rc.local 復制一份改為rc.hisign 修改內容將rc.local 替換為rc.hisign。 # Required-Start: $all 的$all去掉。 rc.hisign內容如下:
#! /bin/sh
### BEGIN INIT INFO
# Provides: rc.hisign
# Required-Start:
# Required-Stop:
# Default-Start: 2 3 4 5
# Default-Stop:
# Short-Description: Run /etc/rc.hisign if it exist
### END INIT INFO
PATH=/sbin:/usr/sbin:/bin:/usr/bin
. /lib/init/vars.sh
. /lib/lsb/init-functions
do_start() {
if [ -x /etc/rc.hisign ]; then
[ "$VERBOSE" != no ] && log_begin_msg "Running local boot scripts (/etc/rc.hisign)"
/etc/rc.hisign
ES=$?
[ "$VERBOSE" != no ] && log_end_msg $ES
return $ES
fi
}
case "$1" in
start)
do_start
;;
restart|reload|force-reload)
echo "Error: argument '$1' not supported" >&2
exit 3
;;
stop|status)
# No-op
exit 0
;;
*)
echo "Usage: $0 start|stop" >&2
exit 3
;;
esac
注意將 # Required-Start: $all 的$all去掉。否則會在所有啟動后在啟動。
或者將已經寫好的rc.hisign 直接添加到/etc/init.d下 ,如果沒有讀寫權限 sudo chmod x rc.hisign 設置權限。
(3) /etc/init.d/下腳本rc.hisign創建完成后,
可以選擇執行 sudo runlevel 查看當前系統啟動級別,結果為 N 5 。
接下來 設定啟動級別
sudo update-rc.d rc.hisign start 01 2 3 4 5 .
01 為啟動序號,
2 3 4 5分別是系統的運行級別,可自己調整只寫一個3等
注意不要忘了結尾的句點。
現在我們到 /etc/rc2.d 下,就多了一個 S01rc.hisign這樣的符號鏈接。
重起計算機,查看是否有效。
至此開機自啟動設置完成。
(三) 附加信息
當你需要移除這個符號連接時,方法有三種:
1. 直接到 /etc/rc2.d 下刪掉相應的鏈接,當然不是最好的方法
2. sudo update-rc.d -f s10 remove //推薦做法 或者 sudo update-rc.d -f rc.hisign remove
3. 如果 update-rc.d 命令你不熟悉,還可以試試看 rcconf 這個命令,也很方便。
4 .update-rc.d rc.hisign defaults 將腳本添加到隨機啟動項
5 . update-rc.d rc.hisign defaults 80 指定服務啟動的順序,數字越小,啟動順序越靠前。
6. sudo sysv-rc-conf 命令去除一些非必要的開機啟動項,沒有sudo apt install sysv-rc-conf 進行安裝
3 .設置監控程序 , 以便當程序推出后可以自啟動程序。
用cron來實現這一功能。
執行sudo crontab -e 最后一行添加 * * * * * /home/ubuntu/keepalive.sh &
前邊幾個* 分別代表年月日時分信息,及每分執行檢測一下該啟動腳本,腳本keepalive.sh內如果程序退出了會重新啟動,如果啟動了 就不會在啟動。
* * * * * command
分 時 日 月 周 命令
第1列表示分鍾1~59 每分鍾用*或者 */1表示
第2列表示小時1~23(0表示0點)
第3列表示日期1~31
第4列表示月份1~12
第5列標識號星期0~6(0表示星期天)
第6列要運行的命令
也可以將*號換成具體的日期時分 固定時間啟動該腳本。
