无法以root身份运行Daemon :: Control perl脚本。 @INC不正确(perlbrew)

时间:2014-09-22 13:44:29

标签: perl perlbrew start-stop-daemon

我在perl中编写了一个Daemon::Control脚本,我可以从用户那里开始/停止作为服务,但现在我想在重启时运行它。 当我以用户身份运行一切顺利时,当我以root身份运行时,它会以

失败
Can't locate Mojo/Server/Morbo.pm in @INC

我使用 service appname start 运行命令,这很好用。 root有一个基本的perl安装,然后用户有一个带有所有正确模块的perlbrew安装。

如果我指定“user”和“group”,则不应Daemon::Control以用户身份运行,并且我还将init_config指定给用户.bashrc文件以设置环境变量。

use warnings;
use strict;
use Daemon::Control;

use Cwd qw(abs_path);

Daemon::Control->new(
    {   name        => "appname",
        lsb_start   => '$syslog $remote_fs',
        lsb_stop    => '$syslog',
        lsb_sdesc   => 'appname startup Short',
        lsb_desc    => 'Morbo , bit lighter than hypnotoad.',
        init_config => "/home/mojouser/.bashrc",
        path        => abs_path($0),

        program => '/home/mojouser/perl5/perlbrew/perls/perl-5.18.1/bin/morbo',

        program_args => [
            '-l', "http://*:3000", '-w', '/home/mojouser/apps/appname/lib',
            '-w',
            '/home/mojouser/apps/appname/templates',
            '/home/mojouser/apps/appname/script/app'
        ],

        user  => 'mojouser',
        group => 'mojouser',

        pid_file    => '/tmp/mojouser_appname.pid',
        stderr_file => '/tmp/mojouser_appname.err',
        stdout_file => '/tmp/mojouser_appname.out',

        fork => 2,
    }
)->run;

2 个答案:

答案 0 :(得分:0)

当以这种方式调用morbo时,不会设置用户的perlbrew环境。 perlbrew是从用户的shell rc激活的,但是在双叉设置$ ENV {HOME},$ ENV {USER}之后所有Daemon::Control都在做,请参阅double_fork()Daemon::Control的来源}

Mojolicious使用#!/usr/bin/env perl为morbo中的shebang行正确使用环境指定的perl。但在这种情况下,您不希望环境指定的perl而是用户的perlbrew perl。如果您将/home/mojouser/perl5/perlbrew/perls/perl-5.18.1/bin/morbo的第一行更改为#!/home/mojouser/perl5/perlbrew/perls/perl-5.18.1/bin/perl,则应该按预期工作。

答案 1 :(得分:0)

通常,作为用户的env包含正确执行某些子进程所需的环境变量,而root的env包含很少。我用$ ENV {whatever} ='something'解决了这个问题;在Daemon :: Control->程序中。 其他人建议在/etc/init.d/program中完成。 FWIW