繁体   English   中英

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

[英]Best way to stop a bash script by ending processes

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

我的想法可以杀死整个过程,但是我认为较大的过程会遇到麻烦,而且我认为可能会有更好的方法:

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 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ stop ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ps aux ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ awk '{print $2}' ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ grep '[n]etworking.sh start' ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ head -n 1 ^C+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ WANTEDID= +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ setsid kill -SIGTERM '' kill: failed to parse argument: '' +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ exit 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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM