带有后台

时间:2015-05-06 12:56:31

标签: linux shell nohup

我有一个名为“CheekyScript.sh”的小脚本,看起来像这样:

#!/bin/bash

nohup mvn run_something_pretty_long

这显然可以很好地工作,因为它会在后台启动一个漫长的过程,在会话过期后用户已经注销后继续运行。

我希望实现的非常简单,引入一点无限循环,这个过程一次又一次地运行,但只是在nohup完成之后。当然,我仍然希望整个bash脚本和nohup在会话到期后运行很久并且我已经注销了。

我在想类似的东西:

#!/bin/bash
while true
do
nohup mvn run_something_pretty_long
sleep 60
done

显然,它的作用是每60秒启动一次nohup进程。想要的是等待nohup,等一下再开始循环。

我想知道这样的最佳实践解决方案是什么?

非常感谢你。

2 个答案:

答案 0 :(得分:0)

使用crontab

添加像这样的条目

1 * * * * /path/to/something

在东西脚本中

#!/bin/bash

LOCKFILE=/var/lock/mvn.lock


[ -f $LOCKFILE ] && exit 0

# Upon exit, remove lockfile.

trap "{ rm -f $LOCKFILE ; exit 255; }" EXIT

touch $LOCKFILE
mvn run_something_pretty_long
exit 0

这会尝试每分钟运行一次脚本,并且大多数因为锁定文件存在而失败。但是如果脚本完成了,那么lockfile就不存在了,它又重新启动了

默认情况下,cron会将所有输出通过电子邮件发送给拥有该作业的用户

答案 1 :(得分:0)

您希望一次或多次运行长时间运行的脚本。你想用nohup运行这两个。由于您已经有一个脚本可以处理第一个(运行一次)的情况,因此请创建两个“CheekyScript.sh”副本。第一个运行一次,第二个运行重复运行(并且可以选择检查完成条件)。

这个运行一次,

#!/bin/bash
#CheekyScriptOnce.sh
nohup mvn run_something_pretty_long

这个反复运行,

#!/bin/bash
#CheekyRepeat.sh
thing="mvn run_something_pretty_long"
delay=60;
nohup (while [ 1 ] ; do $thing; sleep $delay; done)

但是你想要某种方式发出信号。控制文件可以处理,

#!/bin/bash
#CheekyRepeatConditional.sh
thing="mvn run_something_pretty_long"
delay=60;
if [ ! -d etc ] ; then mkdir etc; fi
touch etc/Cheeky.run
nohup (while [ -f etc/Cheeky.run ] ; do $thing; sleep $delay; done)