无法以根用户身份运行守护进程::控制perl脚本。 @INC不正确(perlbrew)

问题描述:

我已经在perl中编写了一个Daemon::Control脚本,我可以从用户开始/停止服务,但现在我希望在重新启动时运行此脚本。 当我运行作为用户一切都很好,当我运行它的根,它无法以根用户身份运行守护进程::控制perl脚本。 @INC不正确(perlbrew)

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

我运行服务的命令APPNAME开始失败,这工作正常。 root有一个基本的perl安装,那么用户有一个perlbrew安装所有正确的模块。

如果我指定“用户”和“组”,则不应该以用户身份运行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; 

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

Mojolicious的家当线采用#!/usr/bin/env perl在morbo中正确使用环境指定的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,它应该按预期工作。

+0

对不起,只是重新读一下你的问题,看到你提到过init_config:'your_daemon_control_script.pl get_init_file> /etc/init.d/appname'?它看起来像init_config只用于那么。 – mikegrb 2014-09-27 04:28:31

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