【发布时间】:2016-11-15 15:54:15
【问题描述】:
我有一个非常简单的 bash 脚本。我希望这个 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 是最重要的),并让每个信号处理程序至少报告哪个信号是已收到。然后重新运行脚本并断开连接并重新连接。您还可以在日志文件中添加时间戳,至少在每次迭代开始时(以及信号处理程序也是如此),以便您知道事情何时发生。 -
How can I close a terminal without killing the command running in it?、Keeping a process running after putty or terminal has been closed、Avoid delays from network calls in logon and logoff scripts 等。我发现我需要使用
disown以获得最佳效果。最好的结果包括在孩子分离后的哪些地方喷出消息。 -
您可以使用终端中的
disown命令来实现同样的目的——但请注意,大多数系统都有一个功能可以完全按照您的意愿进行操作:启动和监视进程,然后重新启动如果它死了。阅读init scripts之类的(实际方法因系统而异)。