如何在perl程序为';你不跑步吗?
我已经像执事一样运行了一个perl程序, perl check.pl& 现在,我可以检查perl程序的运行状态,但是当perl程序不运行时,如何修改shell脚本以运行perl程序呢如何在perl程序为';你不跑步吗?,perl,shell,Perl,Shell,我已经像执事一样运行了一个perl程序, perl check.pl& 现在,我可以检查perl程序的运行状态,但是当perl程序不运行时,如何修改shell脚本以运行perl程序呢 a=`ps -ef | grep "perl" | grep "check" |awk '{print $2}'` for p in $a do echo perl echo $p done 您可以让perl自己运行check,并通过系统crontab定期调用
a=`ps -ef | grep "perl" | grep "check" |awk '{print $2}'`
for p in $a
do
echo perl
echo $p
done
您可以让perl自己运行check,并通过系统crontab定期调用它
use Fcntl ':flock';
flock(DATA, LOCK_EX|LOCK_NB) or die "Already running..\n";
# ...
__DATA__
所以
- 我已经运行了一个类似deamon的perl程序perl check.pl&
等待它的终止。守护进程有一个名为init
的父进程,PID==1
,因此它由init
监视
- 现在,我可以检查perl程序的运行状态
是的,因为您可以检查任何其他程序的状态。有一条评论说,对程序名执行grep会产生一些奇怪的副作用,比如:
$ perl log.pl &
现在,将ps
的输出变大将导致两个“日志”进程,其中一个将是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程序没有运行时,如何修改shell脚本以运行perl程序呢
如果对ps
的输出进行grepping时没有返回任何内容,则应启动脚本。你应该检查你的a
的内容(你真的应该给它起个更好的名字叫a
,比如perlPID
之类)。如果-z
的参数长度为零,则返回“true”,因此:
您可以使用cronjob每隔n分钟检查一次程序是否正在运行,如果没有,则重新启动它。但为此,您应该使其成为一个真正的系统守护进程。Daemon::Control是一个perl模块,有助于创建这样的守护程序。可能有其他的选择,但这是一个我正在使用一段时间了。你想实现什么?你有root/admin权限吗?
$ perl check.pl &
$ ps -ef | grep '[p]erl check'
501 45002 44504 0 11:21 ttys002 0:00.02 perl check.pl
[[ -z "$a" ]] && perl check.pl &