一、前言
前文实现了 树莓派 自启动连接阿里云物联网平台 ,但是由于又时服务需要更新/重启,这里实现 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]