0

我有两个需要异步执行的长时间运行的函数。为简单起见,假设一个函数每 10 秒向客户端发送一次邮件,而其他日志文本文件每两秒发送一次。

我不能使用 cron 作业来执行此操作。一切都必须在一个脚本中。因此,我使用了无限循环和睡眠来&实现异步行为。

用于'pkill -P $$' SIGINT SIGTERM在用户点击时捕获以结束所有子进程(结束程序),CTRL+Z (SIGINT)但这不起作用。即使按下 ,它也会再次开始执行脚本CTRL+Z

如何让用户能够通过从同一终端单击键盘来结束程序?

注意:在用户手动停止程序之前,这两个功能永远不会结束。

echo "Press: CTRL+Z to Close program"

trap 'pkill -P $$' SIGINT SIGTERM

first_fun()
{
    while :; do
        echo "send Mail every 10 seconds"
        sleep 10
    done
}

second_fun()
{
    while :; do
        echo "log text file every 2 seconds"
        sleep 2
    done
}

first_fun &

second_fun &
4

2 回答 2

0

建议使用"让shell解释$$。像这样:

 trap "pkill -9 -P $$" 

还建议杀死从当前目录运行的所有进程,因为进程祖先并不总是有效(例如使用nohup命令):

 trap "pkill -9 -f $PWD" 

还建议使用(标准)杀死/停止进程CTRL-C并避免CTRL-Z 用于暂停进程

于 2022-02-20T08:16:07.877 回答
0

当您的脚本出现问题时,脚本在运行这两个函数后存在。所以“$$”不再是指脚本。一个简单的解决方法是将 await放在脚本的末尾。也改变这个可能会有所帮助

trap "pkill -P $$" INT TERM

但是,我要做的是杀死这些函数而不是杀死脚本:

echo "Press: CTRL+Z to Close program"

first_fun()
{
    while :; do
        echo "send Mail every 10 seconds"
        sleep 10
    done
}

second_fun()
{
    while :; do
        echo "log text file every 2 seconds"
        sleep 2
    done
}

_INTERRUPTED
_PID1
_PID2

interrupt()
{
    # Do this once.
    if [[ -z "$_INTERRUPTED" ]]; then
        _INTERRUPTED='true'
        kill -KILL "$_PID1"
        kill -KILL "$_PID2"
    fi
}

trap interrupt INT TERM EXIT
first_fun &
_PID1="$!"
second_fun &
_PID2="$!"
wait
于 2022-02-20T12:01:49.940 回答