树莓派 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]
作者:Yogile
出处:https://www.cnblogs.com/Yogile/p/12468247.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构