我试图在屏幕上运行命令,但是一旦我在屏幕上用Ctrl-C杀死了子进程,就阻止了它结束会话,就像这样:https : //unix.stackexchange.com/a/47279/79125,但是在我的情况下,该命令以其他用户身份运行,并且我想在按Ctrl-C子进程时重新获得Shell。这是我失败的尝试
$ screen -S mySession -X screen -t tab3 sh -c ' su - appuser -c "cd /appdir/bin; ./app start; bash"'
$ screen -S mySession -X screen -t tab6 su - appuser -c "sh -c 'cd /appdir/bin; ./app start; exec bash'"
$ screen -S mySession -X screen -t tab6 sh -c "su - appuser -c 'cd /appdir/bin; ./app start; exec bash'"
$ screen -S mySession -X screen -t tab6 sh -c "su - appuser -c 'cd /appdir/bin; ./app start; exec bash'; su - someuser -c 'exec bash'"
信号处理
问题在于外壳和应用程序都接收到信号。外壳可能不会简单地忽略该信号,因为它的子进程也会如此。
解决方案是使用信号处理程序,该信号处理程序将信号传递到应用程序:
bash -cm 'trap "kill -INT \$KILLPID" int; /bin/sleep 5 & KILLPID=$!; fg; /bin/echo foo'
-m
之所以需要,是因为非交互式外壳程序默认情况下禁用了作业控制。
完整命令(未经测试):
screen [...] su - appuser -c bash -c 'cd /appdir/bin; ./app start & KILLPID=$!; trap "kill -INT $KILLPID" int; fg; bash'
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句