当我使用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
此外,还有哪些方法可以提高效率?我有一个已编译的程序,我试图确保它始终在运行。
答案 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。