使用 /bin/sh 时脚本未正确执行

Script not executing properly when using /bin/sh

当我只使用 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

此外,有什么方法可以提高效率吗?我有一个编译程序,我试图确保它总是 运行.

这一行有一个问题:

$service=xxx

这可能应该是:

service=xxx

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

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

在多任务系统中以这种方式找到的进程数取决于时间的偶然性。更可靠的方法是使用 pgrep:

pgrep "$service"

这将列出 $service 的 PID,但不可能匹配 grep 进程。

因为pgrep自己设置了一个有用的return代码,所以不需要数学测试。因此,替换:

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

有:

if pgrep -q "$service"

其中 -q 告诉 pgrep 只设置退出代码而不将 PID 列出到标准输出。

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

if pgrep "$service" >/dev/null

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