我有一个通过 GUI (lightdm) 执行的 bash 脚本。
在脚本的某些行中,我希望它:
sudo service lightdm stop
- 停止图形用户界面- 使用例如接管 TTY(如
tty1
或):( 如果控制 TTY,我们可以轻松发送它)。是首选,因为在关闭时,它将可用。tty7
exec </dev/tty7 >/dev/tty7 2>&1
agetty
SIGSTOP
tty7
lightdm
问题在于 bash 脚本是该lightdm
服务的子脚本。
因此,在执行时sudo service lightdm stop
- 它将尝试终止我的脚本/进程。
我发现我需要使用nohup
,但我更喜欢拥有我的已经运行脚本/进程不受SIGHUP
.
我见过建议关于disown
但bg
脚本文件不处于交互模式,因此我不能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(否则您将在此处指定信号处理代码)。