使用tail -f结束脚本的问题


0

我使用以下脚本重新启动在Solaris Sun 5.10机器上运行的Java服务器...

pkill -9 java

nohup ./start_java.sh &

tail -f smx.log

SSH到框(使用Putty)运行脚本。

它只要正常工作,因为我ctrl-c 出了 tail -f关闭腻子之前。如果我不停止尾巴(只是关闭腻子窗口),它会杀死这个start_java过程。

我已经改变了脚本以删除它tail -f,但我很困惑为什么会发生这种情况?

Answers:


2

编写一个执行此操作的脚本:

#!/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终端,但第一个脚本仍然运行完成。)


0

Nohup应该可以工作,但根据我的经验,有时客户实际上是sigkill而不是叹气,所以最终会杀死你的进程,而不是只是告诉他们挂断(就像nohup阻止)。屏幕是问题的一种可能的解决方案,因为它忽略了sigkill,但它也有自己的问题,你必须解决。

可能有一个正在运行的进程使你的终端(或Putty)发送sigkill。


0

虽然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

我认为disown 应该与nohup具有相同的效果。我刚写了一个脚本来测试这个,运行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被捕获。我不确定这些差异会对此有所帮助。
dubiousjim 2010年

@profjim - init如果我理解的话,disown应该使进程成为子进程,所以你应该看到PPID更改。但我老实说不确定; 我真的需要坐下来试验,我没有时间去做。
quack quixote 2010年

@quack,而不是bash 4.1.2。它似乎没有。PPID,PGRP,SESS都保持不变。我一直很困惑自己是否有任何使用方法可以忽略你最初没有的东西。(交互式地,如果你在原始调用中没有使用nohup ,则disown很有用。)
dubiousjim 2010年

@profjim - 你可能是对的,我可能会错误地记住这种情况(当你没有使用nohup时被拒绝)。
quack quixote 2010年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.