现在,我可以检查perl程序的运行状态,但是当perl程序没有运行时,如何修改shell脚本来运行perl程序?
a=`ps -ef | grep "perl" | grep "check" |awk '{print $2}'`
for p in $a
do
echo perl
echo $p
done
答案 0 :(得分:1)
您可以将运行检查留给perl本身,并通过系统crontab定期调用它,
use Fcntl ':flock';
flock(DATA, LOCK_EX|LOCK_NB) or die "Already running..\n";
# ...
__DATA__
答案 1 :(得分:1)
所以,
这个不是 就像一个守护进程,而是一个简单的后台进程。每个进程都有一个父进程。后台进程(如上所述)作为父母有" bash"什么把它发送到bakcground,所以bash可以wait
终止它。 守护程序让父进程使用init
处理名为PID == 1
的进程,因此init
会对其进行监视。
是的,因为您可以查看任何其他程序的状态。一个评论,对程序名称coukd执行此类grep
会产生一些奇怪的副作用,例如:
$ perl log.pl &
现在,点击ps
的输出将导致两个," log"进程,其中一个将是syslogd
进程。当然,您的示例仅限于另一个grep
到perl
,但代价是两个进程。
您可以使用一些更智能的grep参数将两个进程限制为一个,例如
ps -ef | grep 'perl check'
上面会搜索一个进程,字符串" perl check"。不幸的是,这会找到grep
进程本身,比如
$ perl check.pl &
$ ps -ef | grep 'perl check
501 45063 42171 0 11:26 ttys001 0:00.00 grep perl check
501 45002 44504 0 11:21 ttys002 0:00.02 perl check.pl
一个不错的解决方法是使用像
这样的刺痛grep '[p]erl check'
像
$ perl check.pl &
$ ps -ef | grep '[p]erl check'
501 45002 44504 0 11:21 ttys002 0:00.02 perl check.pl
如果忽略ps
的输出没有返回任何内容,则应该启动脚本。您应该检查a
的内容(您真的应该将其更好地命名为a
,例如perlPID
或类似内容。如果-z
的参数长度为零,则返回" true",所以:
[[ -z "$a" ]] && perl check.pl &