System_Daemon无法打开流/var/log/mydaemonname.log

时间:2011-02-08 11:34:30

标签: php daemon

我正在尝试通过cli运行这个简单的守护进程

function doTask(){

    echo 'mytest';
}
// Include PEAR's Daemon Class
require_once "/usr/share/php/System/Daemon.php";

// Bare minimum setup
System_Daemon::setOption("appName", "mydaemonname2");

try{
// Spawn Deamon!
System_Daemon::start();

// Your PHP Here!
while (true) {
    doTask();
}

// Stop daemon!
System_Daemon::stop();
}
catch (Exception $e) {
    echo 'Caught exception: ',  $e->getMessage(), "\n";
}



notice: Starting mydaemonname daemon, output in: '/var/log/mydaemonname.log'
[Feb 08 12:17:23]  warning: [PHP Error] file_put_contents(/var/log/mydaemonname.log): failed to open stream: Permission denied 

在我的本地主机和我的开发服务器中。

如果我尝试粗略创建并将chmod 777文件权限设置为/var/log/mydaemonname.log 我得到了另一个错误

[Feb 08 12:30:31]   notice: Starting mydaemonname daemon, output in: '/var/log/mydaemonname.log'
[Feb 08 12:30:31]      err: Unable to create directory: '/var/run/mydaemonname' [l:1366]
[Feb 08 12:30:31]    emerg: Unable to write pid file /var/run/mydaemonname/mydaemonname.pid [l:1272]
[Feb 08 12:30:31]     info: Process was not daemonized yet, just halting current process

如果我尝试将777文件权限设置为/ var / run / mydaemonname,我会在日志文件中找到它

 notice: Starting mydaemonname daemon, output in: '/var/log/mydaemonname.log'
[Feb 08 12:17:06]      err: Unable to change group of file '/var/run/mydaemonname/mydaemonname.pid' to 0 [l:1425]
[Feb 08 12:17:06]     crit: Unable to change identity [l:1281]
[Feb 08 12:17:06]    emerg: Cannot continue after this [l:1283]

请帮帮我吗?

再见

2 个答案:

答案 0 :(得分:4)

您启动守护程序的用户是什么?如果它不是root,那么你可以回答:

选项“appRunAsUID”和“appRunAsGID”设置守护程序应该切换到子(守护程序)进程中使用的用户。它需要以用户“root”身份启动,以便能够正确访问pid文件。

因此,您应该将“appRunAsUID”和“appRunAsGID”设置为非授权用户,守护脚本将作为其运行,但您需要以“root”身份启动该进程,以便能够编写pid并切换用户。 / p>

答案 1 :(得分:0)

消息表明这是一个许可问题,设置“appRunAsUID”和“appRunAsGID”= 0(用户root的GID和UID)可以解决问题。

与这类问题有关的另一个问题是。从版本0.6.3开始,pidfile需要位于它自己的子目录中。表示第一个守护程序在默认的appPidLocation中运行:

  

的/ var /运行/< appName> /< daemon_name> .pid

你可能会运行的第二个守护进程必须共存于同一个目录中。什么时候可以动态定义

        $path_pid =  '/var/run/'.System_Daemon::getOption('appName');
        System_Daemon::setOption("appPidLocation",$path_pid.'/'.$pidFile);