Answers:
编写一个执行此操作的脚本:
#!/bin/bash
trap 'echo hup' hup
trap 'echo int' int
trap 'echo quit' quit
trap 'echo abrt' abrt
trap 'echo kill' kill
trap 'echo usr1' usr1
trap 'echo usr2' usr2
trap 'echo term' term
trap 'echo chld' chld
trap 'echo cont' cont
trap 'echo stop' stop
trap 'echo tstp' tstp
trap 'echo ttin' ttin
trap 'echo ttou' ttou
shopt huponexit
sleep 10
echo $(date) process $$ done
写第二个脚本: > nohup.out; nohup firstscript& echo sleeping; sleep 10
。运行第二个脚本,等待一两秒,然后关闭PuTTY终端。打开一个新的PuTTY终端并检查nohup.out文件。它应该告诉你第一个脚本收到的信号是什么让它停止。这将帮助您弄清楚如何继续。你可以尝试做trap '' THEGUILTYSIGNAL
一件事。
它还应该告诉你huponexit值。如果启用此功能,您可以进行试验,shopt -u huponexit
看看是否有所改善。(改进=你可以运行第二个脚本然后关闭你的PuTTY终端,但第一个脚本仍然运行完成。)
虽然screen
可能是处理这一点的最好办法,一个备选方案,如果你的脚本bash
,将disown
你的start_java.sh
进程开始之后。这会将进程与终端解除关联,因此当您关闭PuTTY时,任何发送到正在运行的进程的SIGKILL都不会被发送到该进程。
另一种选择是使用tcsh
,它会在退出时自动拒绝后台进程,而不是SIGKILL的进程。
我想你可以disown
像这样添加到你的脚本中:
#!/bin/bash
# might need to specify bash in the line above for this to work right
pkill -9 java
nohup ./start_java.sh &
disown
tail -f smx.log
init
如果我理解的话,disown应该使进程成为子进程,所以你应该看到PPID更改。但我老实说不确定; 我真的需要坐下来试验,我没有时间去做。
nohup foo&; ps -p $! -o pid,ppid,blocked,caught,ignored,pending,pgrp,sess; disown; sleep 1; ps -p $! -o pid,ppid,blocked,caught,ignored,pending,pgrp,sess
。并且sess不会改变,因此在这个意义上,disown不会“将进程与终端分离”。但是存在一些差异:SIGCHLD被阻止,TTIN和TTOU被捕获。我不确定这些差异会对此有所帮助。