【问题标题】:Stop a background loop in bash在 bash 中停止后台循环
【发布时间】:2021-09-16 21:03:32
【问题描述】:

我目前正在开发一个奇怪的项目“Shellcord”,它是一个仅在 bash 和一些内置程序中构建的不和谐机器人。

我已经能够获得心跳间隔。所以我的问题。我的循环如下所示:

(while true
do
  sleep $interval
  echo '{"op":1,"d":null}' > ws0
done)&

现在,我也可以关闭机器人了。但是,我怎样才能停止这个心跳循环呢?

【问题讨论】:

    标签: bash loops background-process


    【解决方案1】:

    最简单的方法是这样的:

    (while true; do
            sleep $interval
            echo '{"op":1,"d":null}'
    done)&
    trap "kill $!" 0
    

    如果您在出口清理方面有更多工作要做,那么您将需要更复杂的东西。您还可以设置陷阱以在开始循环之前向进程组发出信号。比如:

    pgid=$(ps -o pgid= $$| tr -d ' ')
    trap 'kill -- -$pgid' 0
    

    【讨论】:

    • 使用0而不是EXIT有什么特别的原因吗?
    • @Philippe 不,EXIT 可能会更好。
    • 谢谢,我会尝试并尽快报告
    • @William 好吧,捕获“退出”不是问题。我之前已经尝试过杀死 loop-pid,但是,它内部的睡眠进程仍然是活动的,并且在再次清理所有内容之前会再发生一次 ping
    • 这不应该发生。 sleep 将继续运行,但 shell 将在 sleep 退出后立即处理 TERM,并且应该在它执行echo 之前终止。除非您为 TERM 设置了阻止退出的陷阱。但是如果给进程组发送TERM,即使是sleep也会收到信号,应该及时退出。
    猜你喜欢
    • 2019-07-29
    • 2015-10-22
    • 2018-09-07
    • 1970-01-01
    • 2015-08-06
    • 2021-08-18
    • 1970-01-01
    • 2014-10-02
    • 1970-01-01
    相关资源
    最近更新 更多