我有一個腳本(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函式之前捕獲了兩個自定義用戶信號。這些從其他腳本呼叫以重繪 欄。因此,在
重繪 函式中,我取消設定給定變數以再次加載它們,并且我還想終止// This上面代碼中提到的睡眠程序。
但是,在發送信號時,睡眠程序突然消失了。有任何想法嗎?
這是pstree "$(pidof -x flexblocks)"我在腳本之外運行它時的輸出:
flexblocks───sleep
它是信號 USR 信號函式內相同命令的輸出:
flexblocks---pstree
pgrep在重繪 函式內部運行時,沒有找到任何名為sleep的行程。
uj5u.com熱心網友回復:
直到前臺命令(shell 在前進到下一條指令之前等待退出的命令)完成后才會傳遞捕獲的 shell 信號。(wait內置是一個例外。)(POSIX.1-2008 Shell and Utilities §2.11)因此,在 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
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/426452.html
下一篇:為什么在父行程中寫入重復文本?
