如何在 shell 等待当前 运行 程序完成的情况下发送信号?
How can I send a signal without the shell waiting for the currently running program to finish?
如果我使用 kill 发送信号,它似乎会等到当前程序(在本例中 sleep 1000
)完成 运行。当我改为通过在 shell 中按 Ctrl+C
发送 SIGINT 时,它会立即收到中断。
然而,我想要的是在通过 kill
发送信号后立即接收到中断。另外,为什么当我按下 Ctrl+C
时它的行为就像我想要的那样?
#!/usr/bin/env sh
int_after_a_while() {
local pid=
sleep 2
echo "Attempting to kill $pid with SIGINT"
# Here I want to kill the process immediately, but it waits until sleep finishes
kill -s INT $pid
}
trap "echo Interrupt received!" INT
int_after_a_while $$ &
sleep 1000
对于此问题的任何帮助,我将不胜感激。提前致谢!
如参考答案 https://unix.stackexchange.com/questions/282525/why-did-my-trap-not-trigger/282631#282631 中所述,shell 通常会等待实用程序完成,然后 运行 设置陷阱。一些备选方案是:
- 在后台启动漫长的 运行ning 进程,然后使用
wait
内置等待它。当在这样的等待期间接收到陷阱信号时,等待被中断并采取陷阱。不幸的是,wait
的退出状态不区分子进程退出信号和发生陷阱。例如
sleep 1000 &
p=$!
wait "$p"
- 通过
kill -s INT 0
向整个进程组发送信号。效果很像用户按下 Ctrl+C,但如果您的脚本是来自另一个脚本的 运行,则效果可能比您想要的更极端。
- 使用 shell,例如支持
set -o trapsasync
的 zsh 或 FreeBSD sh,它允许在等待前台作业时 运行ning 陷阱。
如果我使用 kill 发送信号,它似乎会等到当前程序(在本例中 sleep 1000
)完成 运行。当我改为通过在 shell 中按 Ctrl+C
发送 SIGINT 时,它会立即收到中断。
然而,我想要的是在通过 kill
发送信号后立即接收到中断。另外,为什么当我按下 Ctrl+C
时它的行为就像我想要的那样?
#!/usr/bin/env sh
int_after_a_while() {
local pid=
sleep 2
echo "Attempting to kill $pid with SIGINT"
# Here I want to kill the process immediately, but it waits until sleep finishes
kill -s INT $pid
}
trap "echo Interrupt received!" INT
int_after_a_while $$ &
sleep 1000
对于此问题的任何帮助,我将不胜感激。提前致谢!
如参考答案 https://unix.stackexchange.com/questions/282525/why-did-my-trap-not-trigger/282631#282631 中所述,shell 通常会等待实用程序完成,然后 运行 设置陷阱。一些备选方案是:
- 在后台启动漫长的 运行ning 进程,然后使用
wait
内置等待它。当在这样的等待期间接收到陷阱信号时,等待被中断并采取陷阱。不幸的是,wait
的退出状态不区分子进程退出信号和发生陷阱。例如
sleep 1000 &
p=$!
wait "$p"
- 通过
kill -s INT 0
向整个进程组发送信号。效果很像用户按下 Ctrl+C,但如果您的脚本是来自另一个脚本的 运行,则效果可能比您想要的更极端。 - 使用 shell,例如支持
set -o trapsasync
的 zsh 或 FreeBSD sh,它允许在等待前台作业时 运行ning 陷阱。