2014-09-22 39 views
2

我已經在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; 

回答

0

當這種方式調用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

0

通常,作爲用戶的env擁有正確執行某個子進程所需的環境變量,而env for root僅包含很少的環境變量。我已經通過$ ENV解決了這個問題{whatever} ='something';在Daemon :: Control->程序中。 其他人推薦使用/etc/init.d/program代替。 FWIW

相關問題