linux - 通过结束进程来停止 bash 脚本的最佳方法

标签 linux bash

我正在尝试设置一个启动脚本,我可以在其中向脚本已启动的进程发送“启动”和“停止”命令。

我想出的方法可以很好地杀死进程,但我认为对于更大的进程我会遇到麻烦,而且我也认为可能有更好的方法来做到这一点:

pingcheck()
{
    ping -c2 "$1" &>/dev/null
    return "$?"
}

start()
{
    while :
    do
        if ! pingcheck "$our_ip"; then
            echo "$our_ip NOT online, WANTEDID >> $WANTEDID"
        else
            echo "$our_ip IS online, WANTEDID >> $WANTEDID"
        fi
    done 
}

stop()
{
    #Find the start process's id
    WANTEDID=$(ps aux | grep '[n]etworking.sh start' | awk '{print $2}' | head -n 1)
    #Kill it in a new processgroup
    setsid kill -9 "$WANTEDID"
    exit 0

}
trap "stop" SIGINT SIGTERM

case "$1" in
    start | stop ) "$1" ;;
esac

bash networking.sh start
192.168.20.5 IS online, WANTEDID >>
192.168.20.5 IS online, WANTEDID >>
192.168.20.5 IS online, WANTEDID >>
192.168.20.5 IS online, WANTEDID >>
192.168.20.5 IS online, WANTEDID >>
bash networking.sh stop
Killed

如有任何关于如何更好地编写此内容的建议,我将不胜感激。

当我使用 SIGTERM 而不是 -9 时,我在屏幕上看到了这个并且 bash 崩溃了(在 ubuntu 上:

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ WANTEDID=26581 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ setsid kill -SIGTERM 26581 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++停止 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ps辅助 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ awk '{print $2}' ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ grep '[n]etworking.sh 开始' ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 头-n 1 ^C+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ WANTEDID= +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ setsid kill -SIGTERM '' 杀死:无法解析参数:'' +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++退出0

最佳答案

感谢我在这里得到的所有出色建议(@Aaron、@Kamil Cuk),脚本现在看起来像这样:

pingcheck()
{
    ping -c2 "$1" &>/dev/null
    return "$?"
}

start()
{
    while :
    do
        if ! pingcheck "$our_ip"; then
            ...do something...
            sleep 10s
        fi
    done 
}

stop()
{
    pkill -nf "$0 start"
    exit 0
}

case "$1" in
    start | stop ) "$1" ;;
esac

而且效果很好。 再次感谢大家!我非常感谢所有的帮助。

关于linux - 通过结束进程来停止 bash 脚本的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52150273/

相关文章:

linux - 无法使用 set -eo pipefail 在管道中成功调用任何外部 shell 脚本

python - 从 python 运行 nohup 和 eval

linux - 来自定时任务的 "stdin: is not a tty"

linux - 如何将星号传递给 bash 脚本中的 ls 命令

python - MySql 没有正确比较 utf-8 字符串?

linux - 打印包含命令的变量

regex - sed 正则表达式 最后一场比赛

linux - Bash 脚本杀死所有程序并在一分钟后重新启动它们

自定义工具链构建失败

python - 在 RHEL 7.2 上安装 Python 2.7.8 和 2.7.5 时出现问题