nohup命令无法正常工作

8

我有一个非常简单的Bash脚本。这个脚本在监控某些服务,因此我希望在退出终端后,它能继续运行。然而,我遇到了一个问题,就是一旦我退出终端,该进程就会被终止。

我以以下方式运行该进程:

nohup ./test.sh > test.log & 

我使用以下方式检查进程:

 ps -aux | grep test.sh

当我运行这个进程时,我会检查脚本是否正在运行。但是,当我重新连接时,脚本就不再运行了。
test.sh文件的内容如下:
#!/bin/bash
while :
do
        echo `date`": ****** Scheduled Test *****"
        result1=$(wget "127.0.0.1" -q -O -)
        result2=$(wget "127.0.0.1" -q -O -)
        echo ": $result1"
        echo ": $result2"
        if [[ $result1 == *"Running OK"* ]] && [[ $result2 == *"Running OK"* ]];
        then
                echo "***** Running OK ***** :)"
                sleep 60
                continue
        fi
        echo "@@@@@ Not Running @@@@@"
        echo "-----> Killing JARS"
        kill -9 `lsof -i:4445 | cut -d' ' -f5`
        kill -9 `lsof -i:4423 | cut -d' ' -f5`
        ./runsomejar.sh > jar1.log & 
        echo "-----> Restarting jar1"
        sleep 60
        echo "-----> Restarting jar2"
        ./runsomejar.sh > jar2.log &
        sleep 180
done

不确定,但建议:(1)将标准错误重定向到日志文件中;如果感到有些偏执,可以将标准输入重定向到 /dev/null;(2)考虑为 HUP、INT、QUIT、TERM、PIPE 和其他可能相关的信号添加信号处理程序(在我看来,HUP 和 TERM 最重要),并且每个信号处理程序至少报告接收到的信号。然后重新运行脚本,断开连接并重新连接。您还可以在日志文件中添加时间戳,至少在每次迭代的开始时(以及信号处理程序),以便知道何时发生事情。 - Jonathan Leffler
如何关闭终端而不杀死其中运行的命令?保持进程在putty或终端关闭后继续运行。避免登录和注销脚本中网络调用的延迟等问题。我发现最好的结果是使用disown。最佳结果包括在子进程分离后仍然输出消息。 - jww
你可以在终端中使用“disown”命令来实现相同的功能,但请注意大多数系统都有一个工具可以完全满足你的需求:启动和监控进程,并在其死亡时重新启动。请查阅“init脚本”等相关文档(实际方法因系统而异)。 - gilez
2个回答

5
您可以使用 screen 命令:
screen -L ./test.sh

你可以使用 Ctrl-Ad 命令来分离屏幕。
你可以不关闭 test.sh 的情况下退出登录。
你可以重新登录,然后输入:
screen -r

回到你的脚本。

标准输出将被记录在screenlog.0中。


1
我没有点踩,但这是使用外部应用程序。我在路由器上遇到了类似的问题,在那里安装东西是不可能的,而且环境非常简约。 - Gall Annonim

2

我认为你可能已经找到了根本原因和可行的解决方案。

但我写这篇答案是为了对其他人有所帮助。

这里可能是根本原因。

然而,nohup的一致性不能保证(在给定答案的末尾提到)。

其他执行相同操作的命令如下:

  1. 使用括号生成子shell。

    (./test.sh > test.log &)

  2. 使用disown和后台运行符号。

    ./test.sh > test.log & disown


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接