加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-15 22:00:51 所属栏目:安全 来源:网络整理
导读:我想知道是否有人可以帮助这个? 我有一个bash脚本.它启动一个子流程,这是另一个基于gui的应用程序.然后bash脚本进入交互模式,从用户获取输入.这种交互模式无限期地继续.我希望它在子进程中的gui-application退出时终止. 我看过SIGCHLD,但这似乎不是答案.这
我想知道是否有人可以帮助这个?

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

我看过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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读