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