• 树莓派 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]
    
  • 相关阅读:
    异步与回调的设计哲学
    CTF之PHP黑魔法总结
    图片隐写分离
    phpMyadmin各版本漏洞
    python 多线程
    order by name 注入
    Python lambda
    Python os.popen() 方法
    你和大牛差了啥
    Error: failure: repodata/repomd.xml from fedora: [Errno 256] No more mirrors to try.
  • 原文地址:https://www.cnblogs.com/Yogile/p/12468247.html
Copyright © 2020-2023  润新知