树莓派 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]
原文地址:https://www.cnblogs.com/Yogile/p/12468247.html