为什么发送信号后脚本的子进程消失了?
Why subprocess of a script disappears after signal is sent?
我有一个脚本 (flexblocks) 每秒打印一次我的系统状态。
这样我就可以用管子把它放进柠檬条里。它看起来像这样:
#!/bin/sh
main() {
while true; do
sleep "1s" // This
// ...
printf '%s\n' "some status here"
done
}
refresh() {
unset "$@"
}
trap "refresh node" "USR1"
trap "refresh pmix song" "USR2"
main
如您所见,我在 main 函数运行之前捕获了两个自定义用户信号
调用。这些从其他脚本调用以刷新栏。所以在
refresh 函数我取消给定变量的设置以再次加载它们,我也
想要终止上面代码中提到的 // This
的睡眠进程。
但是,sleep进程在发送信号的时候突然消失了。任何
想法?
这是 pstree "$(pidof -x flexblocks)"
当我 运行 它在外面时的输出
剧本:
flexblocks───sleep
而且是signal USR函数中同一个commnad的输出
信号:
flexblocks---pstree
pgrep
在刷新函数中 运行ning 时没有找到任何名为 sleep 的进程。
被捕获的 shell 信号直到前台命令(shell 在执行下一条指令之前等待退出的命令)完成后才会传递。 (wait
内置函数是一个例外。)(POSIX.1-2008 Shell and Utilities §2.11)因此,您的 sleep 在 USR1 或 USR2 陷阱出现时已经退出。
例如:
$ cat zzz.sh
#! /bin/sh
trap 'echo USR1 $(date)' USR1
date
sleep 15
date
$ sh zzz.sh &
[1] 7689
Thu Feb 3 11:52:18 CST 2022
$ kill -USR1 7689
$
USR1 Thu Feb 3 11:52:33 CST 2022
Thu Feb 3 11:52:33 CST 2022
[1]+ Done sh zzz.sh
我有一个脚本 (flexblocks) 每秒打印一次我的系统状态。 这样我就可以用管子把它放进柠檬条里。它看起来像这样:
#!/bin/sh
main() {
while true; do
sleep "1s" // This
// ...
printf '%s\n' "some status here"
done
}
refresh() {
unset "$@"
}
trap "refresh node" "USR1"
trap "refresh pmix song" "USR2"
main
如您所见,我在 main 函数运行之前捕获了两个自定义用户信号
调用。这些从其他脚本调用以刷新栏。所以在
refresh 函数我取消给定变量的设置以再次加载它们,我也
想要终止上面代码中提到的 // This
的睡眠进程。
但是,sleep进程在发送信号的时候突然消失了。任何 想法?
这是 pstree "$(pidof -x flexblocks)"
当我 运行 它在外面时的输出
剧本:
flexblocks───sleep
而且是signal USR函数中同一个commnad的输出 信号:
flexblocks---pstree
pgrep
在刷新函数中 运行ning 时没有找到任何名为 sleep 的进程。
被捕获的 shell 信号直到前台命令(shell 在执行下一条指令之前等待退出的命令)完成后才会传递。 (wait
内置函数是一个例外。)(POSIX.1-2008 Shell and Utilities §2.11)因此,您的 sleep 在 USR1 或 USR2 陷阱出现时已经退出。
例如:
$ cat zzz.sh
#! /bin/sh
trap 'echo USR1 $(date)' USR1
date
sleep 15
date
$ sh zzz.sh &
[1] 7689
Thu Feb 3 11:52:18 CST 2022
$ kill -USR1 7689
$
USR1 Thu Feb 3 11:52:33 CST 2022
Thu Feb 3 11:52:33 CST 2022
[1]+ Done sh zzz.sh