如果父进程死亡,子进程继续运行

如果父进程死亡,子进程继续运行

我有一个通过 GUI (lightdm) 执行的 bash 脚本。

在脚本的某些行中,我希望它:

  1. sudo service lightdm stop- 停止图形用户界面
  2. 使用例如接管 TTY(如tty1或):( 如果控制 TTY,我们可以轻松发送它)。是首选,因为在关闭时,它将可用。tty7exec </dev/tty7 >/dev/tty7 2>&1
    agettySIGSTOP
    tty7lightdm

问题在于 bash 脚本是该lightdm服务的子脚本。
因此,在执行时sudo service lightdm stop- 它将尝试终止我的脚本/进程。

我发现我需要使用nohup,但我更喜欢拥有我的已经运行脚本/进程不受SIGHUP.
我见过建议关于disownbg脚本文件不处于交互模式,因此我不能bg。也使用set -m不会有帮助,因为无论如何我需要按CTRL+Z才能暂停我的进程(发送 SIGTSTP 将暂停它,但文件不会继续运行...)。

解决这个问题的可靠且稳健的方法是什么?
使用Ubuntu。


世界标准时间 10 月 8 日 21:35 更新 - 回复@countermode:

我试过:

trap '' HUP
service lightdm stop

还尝试过:

trap '' SIGHUP
service lightdm stop

但它失败了。我知道它失败了,因为在该行之后service lightdm stop我向文件写入了一些数据。这些文件的修改时间太旧(一天前),因此它不起作用。

我尝试使用以下方法捕获所有我认为丢失的信号:

trap_with_arg() {
    func="$1" ; shift
    for sig ; do
        trap "trap_handler $sig" "$sig"
    done
}
trap_handler() {
    echo -e " \n Caught signal $1 \n" >>/path_to_some_folder/_signals.txt
}
echo "" >/path_to_some_folder/_signals.txt
signals_list=""
for i in {1..64} ; do
    signals_list+="$(kill -l $i) "
done
trap_with_arg trap_handler 0 $signals_list

service lightdm stop

正如这里所建议的
所有捕获到的信号是(左边是第一个):HUP, CONT, 0

所以我尝试:

trap '' 0 HUP CONT
service lightdm stop

但也失败了...


世界标准时间 10 月 9 日 08:46 更新:

实际上@countermode的答案效果很好。
我的代码中有一个小错误,所以我认为它不起作用。

答案1

Shell 脚本可以使用关键字设置自己的信号处理程序trap。在您的场景中,您想忽略 SIGHUP,因此您可以在终止 ldm 会话之前调用某个地方

trap '' SIGHUP

其中''(空字符串)表示您要忽略 SIGHUP(否则您将在此处指定信号处理代码)。

相关内容