一、前言
前文實現了 樹莓派 自啟動連接阿里雲物聯網平台 ,但是由於又時服務需要更新/重啟,這里實現 sh腳本實現 kill PID 停止/重啟服務。
對於 shell 腳本命令,可參閱簡單教程:Shell 教程 | 菜鳥教程
二、sh腳本實現 kill PID
示例:
#!/bin/sh
aliyun_iot_device_path="/usr/local/Extension/aliyun_iot_device_quickstart"
aliyun_iot_device_pid=`ps -aux | grep "$aliyun_iot_device_path/index.js" | grep -v grep | awk '{print $2}'`
echo "aliyun_iot_device_pid: "$aliyun_iot_device_pid
sudo kill -9 $aliyun_iot_device_pid
if [ $? -eq 0 ];then
echo "[STOP] aliyun_iot_device [SUCCESS]"
else
echo "[STOP] aliyun_iot_device [FAIL]"
fi
-
#!/bin/sh
是指此腳本使用/bin/sh來解釋執行,#!是特殊的表示符,其后面跟的是解釋此腳本的shell的路徑。 -
第 2 行:
=
前是 shell 變量名,=
后面是獲取的值;=
后面的值,由左右反單引號 ` 包裹。反單引號是命令替換,命令替換是指Shell可以先執行中的命令,將輸出結果暫時保存,在適當的地方輸出。ps -aux
: 不以終端機來區分,以用戶為主的格式來顯示現行終端機下的所有程序狀況 。|
:管道符,左邊命令的輸出成為右邊命令的輸入。grep
: 用於查找文件里符合條件的字符串 。grep -v
:查找並剔除符合條件的字符串。建議使用能唯一確定進程的字符串來查找,否則可能殺錯進程,我是用的是絕對路徑。awk '{print $2}'
:一行一行的讀取指定的文件, 然后以空格作為分隔符,打印第二個字段
-
$?是指上一次命令執行的成功或者失敗的狀態。如果成功就是0,失敗為1。語句if [ $? -eq 0 ] 是判斷if語句的上一個命令執行如果失敗就執行if中的語句,否則就執行else中的內容。
-
kill -9 $aliyun_iot_device_pid
:使用$
調用 shell 變量。 -
[ $? -eq 0 ]
:$?是指上一次命令執行的成功或者失敗的狀態。如果成功就是0,失敗為1。語句if [ $? -eq 0 ];then
是判斷if語句的上一個命令執行如果失敗就執行if中的語句,否則就執行else中的內容。[ $? -eq 0 ]
中括號兩邊與中間$?
的語句需要有一個空格。
執行結果:
pi@raspberrypi:~/PID_Deal $ ./aliyun_iot_device_stop.sh
aliyun_iot_device_pid: 1601
[STOP] aliyun_iot_device [SUCCESS]
三、sh腳本實現程序重啟
示例:
#!/bin/sh
aliyun_iot_device_path="/usr/local/Extension/aliyun_iot_device_quickstart"
aliyun_iot_device_pid=`ps -aux | grep "$aliyun_iot_device_path/index.js" | grep -v grep | awk '{print $2}'`
echo "aliyun_iot_device_pid: "$aliyun_iot_device_pid
sudo kill -9 $aliyun_iot_device_pid
if [ $? -eq 0 ];then
echo "[STOP] aliyun_iot_device [SUCCESS]"
else
echo "[STOP] aliyun_iot_device [FAIL]"
fi
nohup $aliyun_iot_device_path/start.sh >/dev/null 2>&1 &
if [ $? -eq 0 ];then
echo "[RESTART] aliyun_iot_device [SUCCESS]"
else
echo "[RESTART] aliyun_iot_device [FAIL]"
fi
-
基於上一點:sh腳本實現 kill PID 修改。
-
nohup
: 不掛斷地運行命令,此時關閉 SSH 連接,程序依然運行。>/dev/null
:表示將標准輸出到/dev/null
中,/dev/null
是一個空文件(寫入到/dev/null時全部丟失,讀取/dev/null時自己返回EOF)。2>&1
: 表示把標准錯誤重定向到標准輸出 1 。&
:后台運行。注意:&
前要有空格。如果無nohup
、只有&
,雖然程序后台運行,但如果這時關閉 SSH 連接,程序會停止運行。
-
若無
>/dev/null 2>&1
,顯示:nohup: appending output to '/home/pi/nohup.out'
-
若有 ``>/dev/null
,無
>/dev/null 2>&1` ,顯示:nohup: redirecting stderr to stdout
-
可自定義
nohup
輸出:2>&1 1>&2 2>stderr.log 1>stdout.log 等等
執行結果:
pi@raspberrypi:~/PID_Deal $./aliyun_iot_device_restart.sh
aliyun_iot_device_pid: 2444
[STOP] aliyun_iot_device [SUCCESS]
[RESTART] aliyun_iot_device [SUCCESS]