не могу запустить perl-скрипт Daemon::Control от имени пользователя root. @INC неверен (perlbrew)

Я написал скрипт Daemon::Control на Perl, который я могу запускать/останавливать как службу из пользователя, но теперь я хочу, чтобы это запускалось при перезагрузке. Когда я запускаю его как пользователь, все хорошо, когда я запускаю его как root, он терпит неудачу с

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

Я запускаю команду с service appname start , это работает нормально. 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;

person user3032285    schedule 22.09.2014    source источник


Ответы (2)


Окружение perlbrew пользователя не настроено, когда morbo вызывается таким образом. perlbrew активируется из пользовательской оболочки rc, но все, что Daemon::Control делает после двойного fork устанавливает $ENV{HOME}, $ENV{USER}, см. источник для double_fork() в Daemon::Control

Mojolicious использует #!/usr/bin/env perl для строки shebang в morbo, чтобы правильно использовать Perl, указанный средой. Однако в этом случае вам нужен не perl, указанный средой, а Perl Perl пользователей. Если вы измените первую строку /home/mojouser/perl5/perlbrew/perls/perl-5.18.1/bin/morbo на #!/home/mojouser/perl5/perlbrew/perls/perl-5.18.1/bin/perl, все должно работать как положено.

person mikegrb    schedule 27.09.2014
comment
Извините, только что перечитал ваш вопрос и увидел упоминание об init_config. Вы сделали: your_daemon_control_script.pl get_init_file > /etc/init.d/appname? Похоже, init_config используется только тогда. - person mikegrb; 27.09.2014

Часто ваша env как пользователь содержит переменные среды, необходимые для правильного выполнения некоторого подпроцесса, в то время как env для root содержит очень мало. Я решил это с помощью $ENV{независимо} = 'что-то'; в программе Daemon::Control->. Другие рекомендуют делать это в /etc/init.d/program. FWIW

person R Winslow    schedule 04.06.2015