2

我已经用Daemon::Controlperl 编写了一个脚本,我可以从用户那里作为服务启动/停止它,但现在我想在重新启动时运行它。当我以用户身份运行时,一切都很好,当我以 root 身份运行时,它失败了

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

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

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

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;
4

2 回答 2

0

以这种方式调用 morbo 时,未设置用户的 perlbrew 环境。perlbrew 是从用户的 shell rc 激活的,但所有Daemon::Control在双叉设置 $ENV{HOME}、$ENV{USER} 后都在执行,请参阅Daemon::Control中double_fork()的源代码

Mojolicious 使用 morbo#!/usr/bin/env perl中的 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它应该可以按预期工作。

于 2014-09-27T04:22:22.990 回答
0

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

于 2015-06-04T17:37:47.187 回答