这是我的问题 - 我正在尝试编写一个小的包装脚本,在调用 Xorg 时添加一个命令行参数(我无权访问调用者的源代码。)它看起来很简单,但我现在正在运行的问题into 是调用者正在等待USR1
来自 Xorg 的信号。从 XSERVER 手册页:
SIGUSR1
该信号的使用与上述任何一种都完全不同。当服务器启动时,它会检查它是否继承了 SIGUSR1 作为 SIG_IGN 而不是通常的 SIG_DFL。在这种情况下,服务器在设置各种连接方案后向其父进程发送一个 SIGUSR1。Xdm 使用此功能来识别何时可以连接到服务器。
我以为我可以简单地捕获信号并转发它:
#!/bin/bash
parent_trap(){
echo sending USR1 to $PPID &> /tmp/wrapper.log
kill -USR1 $PPID
}
trap "parent_trap" USR1
Xorg $@ (extra stuff) &
wait
但当然这不起作用,因为脚本本身是由调用者忽略USR1
. 我认为我需要做的是让脚本停止忽略信号,但也要以某种方式启动 Xorg 并USR1
忽略(以触发手册页中的行为。)
这在 Bash/其他脚本语言中是否可行?出于几个原因,我希望避免编译解决方案,但这并非不可想象。也有可能我完全在考虑这个错误,并且还有其他方法可以USR1
从 Xorg 到调用者。
你的新脚本
与其尝试对信号做一些花哨的事情,不如直接这样做:
这个怎么运作
为了说明上面的内容,这里有一个更详细的示例,有助于展示
exec
上述脚本中的机制。这将按照您的指定启动 Xorg,但是因为我们使用该
exec
命令Xorg
将假定相同的 PID 并将我们的xorg.bash
脚本替换为它自己。注意:上面最后 3 行的目的是证明在命令
xorg.bash
运行后不再运行/运行。exec sleep ...
例子
首先我们运行我们的脚本:
如果我们要在另一个 shell 中使用它来监控它,
第 1 阶段 - xorg.bash 预执行 第 2 阶段 - xorg.bash 后执行ps auxf
我们会看到这个。请注意,阶段 1
xorg.bash
的 PID 为 22471,但在阶段 2,exec sleep 5
现在具有相同的 PID,即 22471。后面的线
exec ...
该
exec
命令的功能导致当前 shell 被另一个可执行文件替换:因此,
xorg.bash
永远不会执行中的任何命令,因为在该点处exec ....
,xorg.bash
不再作为进程存在,已被sleep
命令替换。参考