有人会说linux不是有crontab 定时运行的命令吗。是的,但不能运行这个程序之前,杀死这个程序的进程。这就需要再写个脚本来杀死进程,再启动程序。
思考了下,完成这个任务有四个步骤:
1.查找到程序在后台运行的进程号;
2.杀死进程;
3.进入程序目录;
4.启动程序;
第一步:查找进程
ps -ef;no,不是的,由于我的是在windows环境中安装了linux的内核(cygwin),相当于有了linux环境,但还是有windows和linux的区别的,windows中的程序进程查找方式得用windows的,linux是不可以的。cygwin中有ps -aW 查找windows下所有的进程。记得W是大写的。接下来还需查出想要的程序进程号.grep 进程名.但如果你想完全匹配进程名的话,需加上参数 -w;awk '{$n}':表示找出进程在第n列的进程号;
第二步:杀死进程
kill 进程号。不,也不是滴,windows进程是不能用这个命令杀死的。如果上一步查到了进程号,用它杀的话,会出现进程找不到的错误提示。这回你是不是纳闷了.哈哈。cygwin中提供一个tskill的命令用来杀死windows进程的。
第三步:进入程序目录
1.最好先进入linux的根目录 cd /(这样方便启动windows程序);
2.在进入windows程序目录 cd cygdrive/(c/d/e/f)这里的c,d,e,f相当于windows的盘(建议目录不要有空格,不然会很麻烦)
第四步:启动程序
./run.bat
完整程序:
#!/bin/sh
cd /;
GatherHome=cygdrive/D/programConfig/GatherServer
cd $GatherHome;
pid=`ps -aW | grep -w GatherServer.exe|awk '{print $1}'`//这里的print最好不要丢哦
if [ "$pid" != "" ]; then
echo "kill current gather pid: " $pid;
tskill $pid;
sleep 20;//注意:这里很重要哦
./gather.bat;
else
echo "first open!";
./gather.bat;
fi
crontab -e
0 */6 * * * /home/Administrator/run.sh //定时每六小时执行run.sh
注意:
一、sleep 20;//这里很重要哦(睡眠二十秒),为什么要这样呢?为什么需要睡眠二十秒?
第一个问题原因:便于观察进程关闭和之后的启动状态;
第二个,因为我的程序关联着端口,打开端口和关闭端口都需要时间;如果没有设置睡眠时间或设置时间太小,会出现address already in use。这会让你纳闷好一阵了。可能会想,怎么可能我明明把进程关了啊,然后在网上一找一大堆linux东东,如果没有些linux基础估计很难搞懂吧。(哈哈,题外话)
二、if的中括号内内容需用空格把内容和括号隔开.
三、 还有一种方法查找进程号pidof processName,但在cygwin中不能用