为什么发送信号后脚本的子进程消失了?

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