2014-09-22 6 views
2

perl에서 Daemon::Control 스크립트를 작성했습니다.이 스크립트는 사용자로부터 서비스로 시작/중지 할 수 있지만 이제 재부팅 할 때 실행하려고합니다. 내가 루트로 실행하면 사용자 모두가 잘 나는이 실행할 때 내가을 시작 프로그램 응용 서비스와 명령을 실행는 root로 Daemon :: Control perl 스크립트를 실행할 수 없습니다. @INC not correct (perlbrew)

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

와 는, 이것이 잘 작동 실패합니다. 루트에 기본 perl 설치가있는 경우 사용자는 모든 올바른 모듈이있는 펄블루 설치를 가지고 있습니다.

"user"와 "group"을 지정하면 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; 

답변

0

사용자의 perlbrew 환경은 morbo가 이렇게 호출 될 때 설정되지 않습니다. perlbrew는 사용자의 쉘 ​​RC에서 활성화되어 있지만, 모든 Daemon::Control은 $ ENV {HOME}는, $ ENV {USER}이, Daemon::Control

Mojolicious에 double_fork()의 소스를 볼 설정되어 이중 포크 후하고있는 오두막 라인에 대한 #!/usr/bin/env perl 사용 환경에 지정된 perl을 올바르게 사용하려면 morbo를 사용하십시오. 하지만이 경우에는 환경에 의해 지정된 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

0

env는 사용자가 환경 변수를 가지고있는 동안 일부 서브 프로세스를 제대로 실행하는 데 필요한 반면 env에는 루트가 거의 들어 있지 않습니다. 나는 $ ENV {whatever} = 'something'에 의해 이것을 해결했습니다. Daemon :: Control-> 프로그램에서. 다른 사람들은 /etc/init.d/program에서 대신 수행 할 것을 권장합니다. FWIW