樹莓派 sh腳本停止或重啟程序


一、前言

前文實現了 樹莓派 自啟動連接阿里雲物聯網平台 ,但是由於又時服務需要更新/重啟,這里實現 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]


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM