USR1信号后可靠地终止睡眠过程

问题描述 投票:2回答:1

我正在编写一个Shell脚本,该脚本在从另一个进程接收到USR1信号后定期执行任务。

脚本的结构类似于this answer

#!/bin/bash

trap 'echo "doing some work"' SIGUSR1

while :
do
    sleep 10 && echo "doing some work" &
    wait $!
done

但是,此脚本的问题是睡眠过程在后台继续,并且仅在超时时终止。 (请注意,在等待$!期间接收到USR1时,睡眠过程会延迟其正常超时,但定期回声实际上会被取消。)例如,您可以使用pkill -0 -c sleep查看计算机上的睡眠过程数。

我读过this page,它建议例如在陷阱操作中杀死挥之不去的睡眠

#!/bin/bash

pid=
trap '[[ $pid ]] && kill $pid; echo "doing some work"' SIGUSR1

while :
do
    sleep 10 && echo "doing some work" &
    pid=$!
    wait $pid
    pid=
done

但是如果我们快速将USR1信号作为垃圾邮件,则该脚本会出现竞争情况,例如与:

pkill -USR1 trap-test.sh; pkill -USR1 trap-test.sh

然后它将尝试杀死已经被杀死的PID并显示错误。更不用说,我不喜欢此代码。

是否有更好的方法来可靠地杀死被中断的分叉进程?还是实现相同功能的替代结构?

我正在编写一个Shell脚本,该脚本在从另一个进程接收到USR1信号后定期执行任务。脚本的结构类似于以下答案:#!/ bin / bash trap'echo“ ...

linux bash shell sleep bash-trap
1个回答
1
投票

让我们首先在交互式外壳中重现该问题。

© www.soinside.com 2019 - 2024. All rights reserved.