在 bash 中停止后台循环

Stop a background loop in bash

我目前正在做一个奇怪的项目 'Shellcord',这是一个仅在 bash 和一些内置函数中构建的 discord 机器人。

我已经可以获取心跳间隔了。所以我的问题。我的循环看起来像这样:

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

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

最简单的方法是这样的:

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

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

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