2014-11-21 69 views
1

我是unix/linux的新手,需要一个shell脚本来启动一个程序,如果它没有运行的话。该程序的名称是“literaail”,它在服务器上有一个位于“/local/publish/mtc_preprint/util/Literail.log”的日志。这个程序应该打印这个“启动ftp检查Get_Job1”。声明每30秒一次。如果没有,我需要一个shell脚本来启动这个过程。目前我做它使用这些命令手动:带有cron作业的Shell脚本在未运行时启动程序?

ps -ef | grep ftp_util_mtc_pp.sh 
ps -ef | grep literail (this command lists the jar file related to the literail program) 
kill "parentjobnumber" "childjobnumber" 
./ftp_util_mtc_pp.sh & (this command restarts the process). 

我有一个“ftp_util_mtc_pp.sh”的文件,这个文件中,我有以下命令:

#!/bin/bash 

utildir="/local/publish/mtc_preprint/util" 

cd $utildir 

java -jar LiteRail_3.0.1.jar literail.properties > /dev/null 2>&1 



exit 

有人可以帮助我的shell脚本。谢谢。

+0

已尝试查找过程编号(如果存在):PROCESS_NUM ='ps -ef | grep“$ 1”| grep -v“literail”| wc -l'如果没有运行java – Jay 2014-11-21 13:44:50

+0

@MoeEhsani我不知道,literail是什么,但请记住,其他用户进程可能会被计算在内。 – 2014-11-21 14:33:37

+0

整个问题在某种程度上被误导 - 使用shell脚本轮询流程表本身不是确保流程或服务继续运行的最佳方式,而是根据问题假定问题。 – 2014-11-21 16:43:10

回答

2

此文件是找到运行LiteRail罐子如果运行它会杀死并重新运行它它不只是运行的罐子,并在指定位置添加日志。

ftp_util_mtc_pp.sh是:

#!/bin/bash 

PID= ps -ef | grep LiteRail_3 

if [[ -z "$PID" ]]; then 
     #process is running so we kill it 
    Kill -9 PID 
fi 

#running the jar file you 
nohup java -jar /local/publish/mtc_preprint/util/LiteRail_3.0.1.jar literail.properties > /local/publish/mtc_preprint/util/Literail.log 2>&1 & 

希望这一个帮助。

0

有两种常见的方法可以做到这一点:

您保存您的进程的PID,并将其保存到一个文件中。

#!/bin/bash 

pf='/home/abc/pidfile' 
if kill -0 $(< "$pf"); then # process in pidfile is yours and running 
    exit 0 
else 
    echo "starting process" 
    echo $$ > "$pf" 
    exec ftp_util_mtc_pp.sh 
fi 

另一种方法是使用PS和grep来检查正在运行的进程:

#!/bin/bash 

if ps -u $UID | grep 'LiteRail_3.0.1.jar' >/dev/null 2>&1; then # process is running 
    exit 0 
else 
    echo "starting process" 
    exec ftp_util_mtc_pp.sh 
fi 

请确保,由ps | grep线正确检测过程。

如果您p纤ep安装:

pgrep -fl -U $UID 'LiteRail_3.0.1.jar' 
0

相反的:

ps -ef | grep ftp_util_mtc_pp.sh 

用途:

pgrep ftp_util_mtc_pp.sh 

这将避免你拿起自己grep命令作为一个过程的问题。您还可以指定一个特定的用户:

pgrep -u $user ftp_util_mtc_pp.sh 

然而,由于你的shell脚本主要是运行一个jar文件,你应该寻找:

pgrep -u $user -f "LiteRail_.*\.jar" 

-f说要寻找的正则表达式整个命令字符串。

现在我们已经开始了,让我们来谈谈crontabs。一个crontab是一个命令,你可以指定你希望它运行的频率。您将该命令放入您的crontab,它可以每分钟运行一次。

您可以创建一个脚本来检查您的java命令是否正在运行,以及是否不重新启动命令。标准输出会邮寄给您,因此您可能需要将其重定向到日志文件或/dev/null

标准操作过程是捕获要确保运行的进程的进程ID,然后检查进程ID是否仍然运行。如果不是,请重新启动作业。您可以在开始工作并将其投入后台后,通过查看$!环境变量来捕获进程ID。