如何正确停止shell脚本?

Mic*_*rer 4 linux bash shell debian

我写了一个小的bash脚本来每3秒启动一个程序.此脚本在启动时执行,并将其PID保存到pidfile中:

#!/bin/bash

echo $$ > /var/run/start_gps-read.pid

while [ true ] ; do
    if [ "$1" == "stop" ] ;
    then
        echo "Stopping GPS read script ..."
        sudo pkill -F /var/run/start_gps-read.pid
        exit
    fi
    sudo /home/dh/gps_read.exe /dev/ttyACM0 /home/dh/gps_files/gpsMaus_1.xml
    sleep 3
done
Run Code Online (Sandbox Code Playgroud)

问题是,我无法通过调用终止shell脚本start_gps-read.sh stop.它应该读取pidfile并停止初始化过程(从启动).

但是当我打电话时stop,脚本仍会运行:

dh@Raspi_DataHarvest:~$ sudo /etc/init.d/start_gps-read.sh stop
Stopping GPS read script ...

dh@Raspi_DataHarvest:~$ ps aux | grep start
root       488  0.0  0.3   5080  2892 ?        Ss   13:30   0:00 /bin/bash /etc/init.d/start_gps-read.sh start
dh        1125  0.0  0.2   4296  2016 pts/0    S+   13:34   0:00 grep start
Run Code Online (Sandbox Code Playgroud)

注意:脚本始终执行为sudo.

有谁知道如何停止我的shell脚本?

che*_*ner 10

在覆盖pid文件之前需要进行"停止"检查,当然不需要在循环内部.

if [ "$1" = stop ]; then
    echo "Stopping ..."
    sudo pkill -F /var/run/start_gps-read.pid
    exit
fi

echo "$$" > /var/run/start_gps-read.pid
while true; do
    sudo /home/dh/gps_read.exe ...
    sleep 3
done
Run Code Online (Sandbox Code Playgroud)