gpt4 book ai didi

bash - 当特定子进程终止时,如何在 bash 脚本中接收通知?

转载 作者:行者123 更新时间:2023-11-29 09:09:44 24 4
gpt4 key购买 nike

不知道有没有人可以帮忙解决这个问题?

我有一个 bash 脚本。它启动一个子进程,这是另一个基于 gui 的应用程序。然后 bash 脚本进入交互模式,从用户那里获取输入。这种交互模式无限期地持续下去。我希望它在子进程中的 gui 应用程序退出时终止。

我看过 SIGCHLD 但这似乎不是答案。这是我尝试过的方法,但程序结束时我没有收到信号。

set -o monitor

"${prog}" &
prog_pid=$!

function check_pid {
kill -0 $1 2> /dev/null
}

function cleanup {
### does cleanup stuff here
exit
}


function sigchld {
check_pid $prog_pid
[[ $? == 1 ]] && cleanup
}

trap sigchld SIGCHLD

更新了以下答案。我现在使用“nosid”的建议进行这项工作。我现在有另一个相关的问题,即接下来的交互过程是一个基本的菜单驱动过程,它会阻止等待用户的键输入。如果子进程结束,USR1 信号直到收到输入后才会被处理。有没有办法强制立即处理信号?

等待看起来像这样:

stty raw                 # set the tty driver to raw mode 
max=$1 # maximum valid choice
choice=$(expr $max + 1) # invalid choice
while [[ $choice -gt $max ]]; do
choice=`dd if=/dev/tty bs=1 count=1 2>/dev/null`
done
stty sane # restore tty

更新了解决方案。我已经解决了这个问题。诀窍是使用非阻塞 I/O 进行读取。现在,有了“nosid”的回答和我的修改,我得到了我想要的。为了完整起见,以下是对我有用的:

#!/bin/bash -bm
{
"${1}"
kill -USR1 $$
} &

function cleanup {
# cleanup stuff
exit
}

trap cleanup SIGUSR1

while true ; do
stty raw # set the tty driver to raw mode
max=9 # maximum valid choice
while [[ $choice -gt $max || -z $choice ]]; do
choice=`dd iflag=nonblock if=/dev/tty bs=1 count=1 2>/dev/null`
done
stty sane # restore tty

# process choice

done

最佳答案

这是一种不同的方法。您可以在 GUI 应用程序终止后立即执行任意命令,而不是使用 SIGCHLD。

{
some_command args...
kill -USR1 $$
} &

function sigusr1() { ... }

trap sigusr1 SIGUSR1

关于bash - 当特定子进程终止时,如何在 bash 脚本中接收通知?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12751547/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com