我有一个名为“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,等一下再开始循环。
我想知道这样的最佳实践解决方案是什么?
非常感谢你。
答案 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)