使用/ bin / sh时脚本无法正常执行

时间:2016-05-05 20:07:44

标签: shell redhat ps

当我使用sh执行时,我的脚本无法正常运行,直到今天它才能正常运行。即使在cronjob中,它也常常没有问题地执行。

/bin/sh process_check.sh

但是当我使用以下方式执行时似乎执行正常

./process_check.sh

脚本(检查进程是否正在运行,如果进程未运行则执行该进程)

#/bin/sh
     $service=xxx

    if (( $(/bin/ps -ef | grep $service | wc -l) > 1 ))
      then
         true
      else
         echo "$service is not running!!!"
         /usr/sbin/xxx
      fi

此外,还有哪些方法可以提高效率?我有一个已编译的程序,我试图确保它始终在运行。

2 个答案:

答案 0 :(得分:1)

这一行存在一个问题:

$service=xxx

这可能应该是:

service=xxx

此外,以下内容本质上不可靠:

(( $(/bin/ps -ef | grep $service | wc -l) > 1 ))

在多任务系统中以这种方式找到的进程数取决于计时事故。更可靠的方法是使用pgrep

pgrep "$service"

这将列出$service的PID,但无法匹配grep进程。

因为pgrep本身设置了一个有用的返回码,所以不需要进行数学测试。因此,替换:

if (( $(/bin/ps -ef | grep $service | wc -l) > 1 ))

使用:

if pgrep -q "$service"

其中-q告诉pgrep设置退出代码而不将PID列为stdout。

如果您的pgrep不支持-q选项,请使用:

if pgrep "$service" >/dev/null

答案 1 :(得分:1)

在脚本的第一行,您使用#/ bin / sh而不是#!/ bin / sh。当你使用./process_check.sh时,它使用/ bin / bash而不是/ bin / sh。