我在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;
答案 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