【问题标题】:How to start-stop perl daemon from php如何从 php 启动停止 perl 守护进程
【发布时间】:2012-11-23 12:56:07
【问题描述】:

我需要从 web 应用程序 (php) 控制 (start\stop\restart) perl 守护程序。 当我从命令行使用我的初始化脚本 (/etc/init.d/foodaemon start (works fine) ) 时,守护程序正确启动(并运行),但它不起作用(守护程序已关闭但创建了 pid 文件,就好像当我尝试从应用程序启动时,守护进程在创建后死亡)。 在我的 /etc/sudoers 中,我添加了

apache  ALL = NOPASSWD: /etc/init.d/foodaemon

在我的 php 脚本中,

$cmd = "/usr/bin/sudo /etc/init.d/foodaemon start";                             
exec($cmd,$out,$ret);

我拥有所有权限。 perl 脚本是

#!/usr/bin/perl
use strict;
use warnings;
use Proc::Daemon;
Proc::Daemon::Init;

my $continue = 1;
$SIG{TERM} = sub { $continue = 0 };

close STDIN;
open STDERR,">>/tmp/mylog";
print "My pid: $$\n";
close STDOUT;

while ($continue) {

        # ... what I need        
}   

【问题讨论】:

    标签: php perl daemon


    【解决方案1】:

    已解决...我的 init.d 脚本中有错误,或者更确切地说

    case "$1" in
        start)
            if [ -z "$(pgrep $DAEMON)" ]
            then
    
                # DAEMON is not running                         
                printf "%-50s" "Starting $NAME..."
    
                cd $DAEMON_PATH
                PID=`$DAEMON > /dev/null 2>&1 & echo $!`
    
                #echo "Saving PID" $PID " to " $PIDFILE
                if [ -z $PID ]; then
                    printf "%s\n" "Fail"
    

    我没有权限这样做

    cd $DAEMON_PATH
    

    所以,我更新如下

     #cd $DAEMON_PATH
     PID=`$DAEMON_PATH/$DAEMON > /dev/null 2>&1 & echo $!`
    

    它有效...对不起...

    【讨论】:

    • 干得好。为什么不点击答案上的绿色复选标记,这样这个答案就不会出现在未回答的问题区域中。