Hi Daniel,
 
Thank you very much.

David


在 2017年11月26日星期日 UTC+8下午10:02:43,Daniel Mantovani写道:
>
> Hi David,
> Exactly, thats why you should check what are the differences among both 
> cases (manual start vs systemd start). That means checking perl that end up 
> called in each case (probably looking at the shebang line at invoqued 
> hypnotoad), relevant environment variables, running directory, users 
> permissions to access needed files, and as I said before, what is the 
> content of the @INC array in each case.
>
> Or you could install your own perl version (newer that the 5.16 you 
> mention in the original entry) and all perl modules related to your code, 
> and assure that your manual setup and the sytemd uses this controlled 
> environment (for instance, make sure that running "which hypnotoad" from 
> where you run the manual start gives you the same path you use in your 
> service file). To go this way, you should use perlbrew or plenv. Here is a 
> link with some explanations on using the latter 
> http://www.dagolden.com/index.php/2390/setting-up-a-perl-development-environment-with-plenv/,
>  
> that I found usefull.
>
> Hope it helps,
> BR,
> Daniel
> El sábado, 25 de noviembre de 2017, 0:20:50 (UTC-3), davi...@gmail.com 
> escribió:
>>
>> Hi Daniel,
>>      Thank you gudie, but it's running ok when manually  start.
>>      I try to check the perl.
>>
>> David
>>
>>
>> 在 2017年11月24日星期五 UTC+8下午9:58:54,Daniel Mantovani写道:
>>>
>>> Hi David, those 'Compilation failed in require at ... ' normally mean 
>>> that perl is not able to find some modules at an "use" or "require" 
>>> function call. You probably have to review those files at the lines 
>>> mentioned, also which perl are using in each case (whether you are using 
>>> system perl, or better installed your own user perl with perlbrew, or with 
>>> plenv), and probably what directories are in your @INC array in each case. 
>>>
>>> There are several ways to install modules in perl, and it is possible 
>>> that when you run the script from inside the Unit file there are different 
>>> versions of @INC leading to different directories an missing libraries in 
>>> one of the cases.
>>>
>>>
>>>
>>> El viernes, 24 de noviembre de 2017, 7:34:02 (UTC-3), davi...@gmail.com 
>>> escribió:
>>>>
>>>> Hi Daniel,
>>>> Thank you deltail adivces.
>>>> I test follow your guide, but it's error same as I report before, it's 
>>>> in Mojolicious 7.57.
>>>> I once change Mojolicious to 6.58 to test, it's still error, error 
>>>> output:
>>>>
>>>> [root@localhost ~]# systemctl status mojo_test.service
>>>> ● mojo_test.service - My Mojolicious application
>>>>    Loaded: loaded (/usr/lib/systemd/system/mojo_test.service; enabled; 
>>>> vendor preset: disabled)
>>>>    Active: failed (Result: exit-code) since Fri 2017-11-24 18:23:20 
>>>> CST; 6s ago
>>>>   Process: 2822 ExecStart=/root/perl5/bin/hypnotoad /home/mojo_user/
>>>> mojo_test.pl (code=exited, status=2)
>>>>   Process: 2820 ExecStartPre=/usr/bin/install -o mojo_user -g mojo_user 
>>>> -d /var/log/mojo_test (code=exited, status=0/SUCCESS)
>>>>   Process: 2819 ExecStartPre=/usr/bin/install -o mojo_user -g mojo_user 
>>>> -d /run/mojo_test (code=exited, status=0/SUCCESS)
>>>>
>>>> Nov 24 18:23:20 localhost.localdomain hypnotoad[2822]: BEGIN 
>>>> failed--compilation aborted at 
>>>> /usr/local/share/perl5/Mojo/Server/Daemon.pm 
>>>> line 2.
>>>> Nov 24 18:23:20 localhost.localdomain hypnotoad[2822]: Compilation 
>>>> failed in require at /usr/local/share/perl5/Mojo/Base.pm line 77.
>>>> Nov 24 18:23:20 localhost.localdomain hypnotoad[2822]: BEGIN 
>>>> failed--compilation aborted at 
>>>> /usr/local/share/perl5/Mojo/Server/Prefork.pm line 2.
>>>> Nov 24 18:23:20 localhost.localdomain hypnotoad[2822]: Compilation 
>>>> failed in require at /usr/local/share/perl5/Mojo/Server/Hypnotoad.pm line 
>>>> 9.
>>>> Nov 24 18:23:20 localhost.localdomain hypnotoad[2822]: BEGIN 
>>>> failed--compilation aborted at 
>>>> /usr/local/share/perl5/Mojo/Server/Hypnotoad.pm line 9.
>>>> Nov 24 18:23:20 localhost.localdomain hypnotoad[2822]: Compilation 
>>>> failed in require at /root/perl5/bin/hypnotoad line 20.
>>>> Nov 24 18:23:20 localhost.localdomain systemd[1]: mojo_test.service: 
>>>> control process exited, code=exited status=2
>>>> Nov 24 18:23:20 localhost.localdomain systemd[1]: Failed to start My 
>>>> Mojolicious application.
>>>> Nov 24 18:23:20 localhost.localdomain systemd[1]: Unit 
>>>> mojo_test.service entered failed state.
>>>> Nov 24 18:23:20 localhost.localdomain systemd[1]: mojo_test.service 
>>>> failed.
>>>>
>>>>
>>>> David
>>>>
>>>>
>>>> 在 2017年11月24日星期五 UTC+8上午8:45:57,Daniel Mantovani写道:
>>>>>
>>>>> Hi,
>>>>>
>>>>> Type=forking should work just fine, I am not sure that with 
>>>>> Type=simple you will have all the functionallity you can get from systemd.
>>>>>
>>>>> A couple of advices though:
>>>>>
>>>>> 1) to get more confortable with systemd, you probably want to 
>>>>> replicate as much as possible the example in 
>>>>> Mojolicious::Guides::Cookbook. 
>>>>> It just works very well (
>>>>> https://metacpan.org/pod/distribution/Mojolicious/lib/Mojolicious/Guides/Cookbook.pod#Hypnotoad
>>>>> )
>>>>>
>>>>> 2) But if you need to have pidfile and log files outside your working 
>>>>> directory (like in /run/your_app/hypnotoad.pid and 
>>>>> /var/log/your_app/production.log etc...), this simple approach will not 
>>>>> work, because you probably don't want to run your application with 
>>>>> permissions so high it will be able to write in /run or /var/log 
>>>>> directories. Instead you normally use a user with minimal permissions.
>>>>> Besides as far as I know hypnotoad requires to have permission rights 
>>>>> in an already created directory for the pid file and also for the log 
>>>>> file.
>>>>>
>>>>> If that is the case, what you can do is modify your original service 
>>>>> file as follows:
>>>>>
>>>>> (I am supossing here that "/home/mojo_test.pl" is a typo, I guess if 
>>>>> your user is "mojo_user" for instance, the path to the app will be 
>>>>> something like "/home/mojo_user/mojo_test.pl")
>>>>>
>>>>> mojo_test.service
>>>>> [Unit]
>>>>> Description=My Mojolicious application
>>>>> Requires=network.target
>>>>> After=network.target
>>>>>
>>>>> [Service]
>>>>> Type=forking
>>>>> PIDFile=/run/mojo_test/hypnotoad.pid
>>>>> User=mojo_user
>>>>> Group=mojo_user
>>>>> PermissionsStartOnly=True
>>>>> ExecStartPre=/usr/bin/install -o mojo_user -g mojo_user -d 
>>>>> /run/mojo_test
>>>>> ExecStartPre=/usr/bin/install -o mojo_user -g mojo_user -d 
>>>>> /var/log/mojo_test
>>>>> ExecStart=/usr/local/bin/hypnotoad /home/mojo_user/mojo_test.pl
>>>>> ExecReload=/usr/local/bin/hypnotoad /home/mojo_user/mojo_test.pl
>>>>> KillMode=process
>>>>>
>>>>> [Install]
>>>>> WantedBy=multi-user.target
>>>>>
>>>>> Please check that in your configuration file you have the pid set as 
>>>>> /run/mojo_test/hypnotoad.pid, and that when
>>>>> you define the path for the log file it goes inside /var/log/mojo_test 
>>>>> directory, something like
>>>>>
>>>>> sub startup {
>>>>>     ...
>>>>>     $self->app->log->path('/var/log/mojo_test/production.log');
>>>>>     ...
>>>>>
>>>>> }
>>>>>
>>>>> About the zero downtime hypnotoad feature, with reload it should work 
>>>>> without any problems (you can check that in the log file). If you restart 
>>>>> instead of course it will kill the process and then start again, and you 
>>>>> can check that also in the log file.
>>>>>
>>>>> One last thing, if you happen to have a recent version of systemd or 
>>>>> you are allowed to install that (not my case unfortunatelly), you should 
>>>>> check RuntimeDirectory= and LogsDirectory= directives. You can check if 
>>>>> those are supported in your system with 
>>>>>
>>>>> $ man systemd.directives
>>>>>
>>>>> If you have those, you will probably not need the ExecStartPre 
>>>>> directives above, because the only thing these do is to create those 
>>>>> directories.
>>>>>
>>>>> Hope it helps.
>>>>> BR,
>>>>> Daniel
>>>>>
>>>>> El jueves, 23 de noviembre de 2017, 13:36:10 (UTC-3), Boyd Duffee 
>>>>> escribió:
>>>>>>
>>>>>> On 23/11/17 16:14, Dan Book wrote: 
>>>>>> > I would not recommend running hypnotoad as a Type=simple service 
>>>>>> with -f. 
>>>>>> > This will not allow you to use hot-restarts via systemctl reload. 
>>>>>>
>>>>>> Naively, I _can_ hot-restart with systemctl reload servicename, but 
>>>>>> now 
>>>>>> you've got me worried. 
>>>>>> Any idea why it's not advisable and is Type=forking the proper 
>>>>>> solution? 
>>>>>>
>>>>>> -- 
>>>>>> Boyd Duffee            Keele University    (01782) 734225 
>>>>>> DevOps - Student Facing Systems 
>>>>>>
>>>>>>   Some people are born on third base and go through life 
>>>>>>   thinking they hit a triple - Barry Switzer 
>>>>>>
>>>>>

-- 
You received this message because you are subscribed to the Google Groups 
"Mojolicious" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to mojolicious+unsubscr...@googlegroups.com.
To post to this group, send email to mojolicious@googlegroups.com.
Visit this group at https://groups.google.com/group/mojolicious.
For more options, visit https://groups.google.com/d/optout.

Reply via email to