有人会说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中不能用