如何在perl程序未运行时自动运行perl程序?

时间:2014-09-01 08:50:01

标签: perl shell

我已经运行了一个类似deamon的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

2 个答案:

答案 0 :(得分:1)

您可以将运行检查留给perl本身,并通过系统crontab定期调用它,

use Fcntl ':flock';
flock(DATA, LOCK_EX|LOCK_NB) or die "Already running..\n";

# ...


__DATA__

答案 1 :(得分:1)

所以,

  • 我运行了一个类似deamon的perl程序,perl check.pl&

这个不是 就像一个守护进程,而是一个简单的后台进程。每个进程都有一个进程。后台进程(如上所述)作为父母有" bash"什么把它发送到bakcground,所以bash可以wait终止它。 守护程序让父进程使用init处理名为PID == 1的进程,因此init会对其进行监视。

  • 现在,我可以检查perl程序的运行状态,

是的,因为您可以查看任何其他程序的状态。一个评论,对程序名称coukd执行此类grep会产生一些奇怪的副作用,例如:

$ perl log.pl &

现在,点击ps的输出将导致两个," log"进程,其中一个将是syslogd进程。当然,您的示例仅限于另一个grepperl,但代价是两个进程。

您可以使用一些更智能的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
  • 但是当perl程序没有运行时如何修改shell脚本以运行perl程序?

如果忽略ps的输出没有返回任何内容,则应该启动脚本。您应该检查a的内容(您真的应该将其更好地命名为a,例如perlPID或类似内容。如果-z的参数长度为零,则返回" true",所以:

[[ -z "$a" ]] && perl check.pl &