【发布时间】:2014-12-03 00:54:07
【问题描述】:
我已从夜间循环服务更改为每周一次,但在更新 INI 后,我希望服务器立即循环服务。我想我可以使用“at”命令并将其与更新 INI 文件的命令一起发送。
问题是这样的,我使用的命令与我在 cronjob 中使用的命令相同,但不是像使用 cron 那样只循环一次,当我使用“at”时,服务会每隔几分钟循环一次.
使用“at”的脚本
#!/bin/bash
export SRVINI=/u01/home/me/scripts/buildini
SERVERLIST=$SRVINI/serverlist.txt
## Generate the body to send out to each server
touch $SRVINI/body.ini
## copying server.ini commented out as Senthil wants a different copy that he will edit
#cp $SRV_DATA/server.ini $SRVINI/
$SRVINI/generate_body.pl
#rm $SRVINI/server.ini
## scp the body of the ini file to each server
for i in `cat $SERVERLIST` ; do
scp $SRVINI/body.ini $i:$SRVINI/
done
## Call outside perl script to manipulate the files
for i in `cat $SERVERLIST` ; do
ssh $i "source ~/.bash_profile ; cd $SRVINI ; $SRVINI/buildini.pl ; at now + 15 minutes <<< '/u01/home/server/scripts/cycleSRVC.sh > /u01/home/server/logs/cycleSRVC.log 2>&1'"
done
rm $SRVINI/body.ini
Cronjob
15 04 * * 6 /u01/home/me/scripts/cycleSRVC.sh >/u01/me/tomax/logs/cycleSRVC.log 2>&1
我使用了“atq”并验证了每台服务器上只创建了一个作业。这让我觉得我的脚本是通过 ssh 正确发送的。
我知道循环脚本可以工作,因为它在作为 cronjob 运行时没有问题。
我尝试了传递“at”命令的不同方法,它们都在所有服务器上创建了一个作业,它们都运行,但几分钟后它们都重新开始循环,我必须手动终止循环,杀死服务并重新启动它们。
不知如何继续。目前,当我对 INI 进行更新时,我会在所有 8 台服务器上手动循环服务。非常感谢您的帮助。谢谢。
更新
我注意到,当我在运行后执行“atq”时,它显示为
>atq
22 2014-12-02 22:01 = usr
这是否意味着它一直在运行?这是否意味着循环脚本有错误,因此它从未完成 at 命令?如果是这样,为什么它可以作为 cronjob 工作?
最终更新:
发现问题。它在cycleSRVC.sh 脚本中,而不是'at'。 当我的服务开始备份时,我会调用:
# Restart services
/u01/app/progs/start.sh
sleep 30
我必须添加一个“&”来将 start.sh 推到后台。不这样做会使它处于一种奇怪的状态,之后会调用 sleep 。奇怪的小东西给我带来了很多问题。
在此处发布此内容以帮助其他可能有同样挫败感的人。
【问题讨论】:
-
请将您的解决方案作为答案发布,以将该问题从“未回答”列表中删除。另见:stackoverflow.com/help/self-answer
-
@Ruud 谢谢!会做