<div dir="ltr">Thanks Mantas and Reindl for all your suggestions.</div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, Jul 26, 2019 at 7:29 PM Reindl Harald <<a href="mailto:h.reindl@thelounge.net">h.reindl@thelounge.net</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><br>
<br>
Am 26.07.19 um 15:37 schrieb Debraj Manna:<br>
> Thanks Reindl for replying. <br>
> <br>
> Can we make use of the watchdog & systemd-notify functionality of<br>
> systemd? I mean something like this. <br>
<br>
probably you can but i doubt you gain anything<br>
<br>
you just increase complexity with additional points of errors and i<br>
don't see the point when you have to use curl in both cases where the<br>
difference to just call "systemctl condrestart" is<br>
<br>
write a nice logline with 'logger' and the same wording as a failed<br>
service, i do that because a cronjob collects all that events systemwide<br>
to trigger cron mails<br>
<br>
don't forget 'condrestart' because it's not funny when you stop a<br>
service by purpose and some monitoring fires it up unasked, been there<br>
with mysqld 10 years ago.....<br>
<br>
that below is part of my httpd rpm and works like a charme for years and<br>
"$max_fail_count = 3" with the sleep is important in the real world<br>
because when you are under load and temporary out of workers it's not<br>
funny when some "crap" restarts the webserver and reset the PHP bytecode<br>
cache all the time<br>
<br>
---------------------------------------------------------------------<br>
<br>
[root@testserver:~]$ systemctl status monitor-httpd<br>
● monitor-httpd.service - Monitor/Restart Webserver<br>
   Loaded: loaded (/usr/lib/systemd/system/monitor-httpd.service;<br>
enabled; vendor preset: disabled)<br>
   Active: active (running) since Thu 2019-07-25 04:48:57 CEST; 1 day<br>
11h ago<br>
 Main PID: 821 (php)<br>
    Tasks: 1 (limit: 512)<br>
   Memory: 3.7M<br>
   CGroup: /system.slice/monitor-httpd.service<br>
           └─821 /usr/bin/php -n -d display_errors=1 -d<br>
display_startup_errors=1 /usr/bin/monitor-httpd.php<br>
<a href="https://rhsoft.testserver.rhsoft.net/robots.txt" rel="noreferrer" target="_blank">https://rhsoft.testserver.rhsoft.net/robots.txt</a><br>
<br>
---------------------------------------------------------------------<br>
<br>
[root@testserver:~]$ cat /usr/lib/systemd/system/monitor-httpd.service<br>
[Unit]<br>
Description=Monitor/Restart Webserver<br>
After=httpd.service network-online.target<br>
Requires=network-online.target<br>
ConditionPathExists=/etc/sysconfig/monitor-httpd<br>
ConditionPathExists=/usr/bin/monitor-httpd.php<br>
ConditionPathExists=/usr/bin/php<br>
<br>
[Service]<br>
Type=simple<br>
EnvironmentFile=/etc/sysconfig/monitor-httpd<br>
ExecStart=/usr/bin/php -n -d display_errors=1 -d<br>
display_startup_errors=1 /usr/bin/monitor-httpd.php $MONITOR_URL<br>
<br>
Restart=always<br>
RestartSec=5<br>
TimeoutSec=5<br>
<br>
User=root<br>
Group=root<br>
<br>
CapabilityBoundingSet=CAP_KILL<br>
MemoryDenyWriteExecute=yes<br>
NoNewPrivileges=yes<br>
PrivateDevices=yes<br>
PrivateTmp=yes<br>
ProtectControlGroups=yes<br>
ProtectHome=yes<br>
ProtectKernelModules=yes<br>
ProtectKernelTunables=yes<br>
ProtectSystem=strict<br>
<br>
[Install]<br>
WantedBy=multi-user.target<br>
<br>
---------------------------------------------------------------------<br>
<br>
[root@testserver:~]$ cat /etc/sysconfig/monitor-httpd<br>
MONITOR_URL=<a href="https://rhsoft.testserver.rhsoft.net/robots.txt" rel="noreferrer" target="_blank">https://rhsoft.testserver.rhsoft.net/robots.txt</a><br>
<br>
---------------------------------------------------------------------<br>
<br>
[root@testserver:~]$ cat /usr/bin/monitor-httpd.php<br>
#!/usr/bin/php<br>
<?php declare(strict_types=1);<br>
/** make sure we are running as shell-script */<br>
if(PHP_SAPI !== 'cli')<br>
{<br>
 exit("FORBIDDEN\n");<br>
}<br>
<br>
/** we need at test-url as param */<br>
if(empty($_SERVER['argv'][1]))<br>
{<br>
 exit("USAGE: monitor-httpd.php <URL>\n");<br>
}<br>
<br>
/** do not verify certificates */<br>
stream_context_set_default(['ssl'=>['verify_peer'=>FALSE,<br>
'verify_peer_name'=>FALSE, 'allow_self_signed'=>TRUE]]);<br>
<br>
/** lower default timeouts */<br>
ini_set('default_socket_timeout', '5');<br>
<br>
/** init vars */<br>
$max_fail_count = 3;<br>
$fail_count     = 0;<br>
$last_restart   = 0;<br>
<br>
/** service loop */<br>
while(true)<br>
{<br>
 if(check_service() !== TRUE)<br>
 {<br>
  $fail_count++;<br>
  sleep(3);<br>
 }<br>
 /** avoid false positives and too fast restarts */<br>
 if($fail_count >= $max_fail_count && (time()-$last_restart) > 60)<br>
 {<br>
  echo __FILE__ . ": ERROR - httpd.service: Service hold-off time over,<br>
scheduling restart\n";<br>
  passthru('/usr/bin/systemctl condrestart httpd.service');<br>
  $fail_count   = 0;<br>
  $last_restart = time();<br>
 }<br>
 /** sleep 10 seconds between checks */<br>
 sleep(10);<br>
}<br>
<br>
/**<br>
 * check if service is available and responds<br>
 *<br>
 * @access public<br>
 * @return bool<br>
*/<br>
function check_service(): bool<br>
{<br>
 $rw = @file_get_contents($_SERVER['argv'][1]);<br>
 if($rw === FALSE)<br>
 {<br>
  return FALSE;<br>
 }<br>
 else<br>
 {<br>
  return TRUE;<br>
 }<br>
}<br>
<br>
> [Unit]<br>
> Description=Test service<br>
> After=network.target<br>
> <br>
> [Service]<br>
> Type=notify<br>
> # test.sh wrapper script to call the service<br>
> ExecStart=/opt/test/test.sh<br>
> Restart=always<br>
> RestartSec=1<br>
> TimeoutSec=5<br>
> WatchdogSec=5<br>
> <br>
> [Install]<br>
> WantedBy=multi-user.target<br>
> <br>
> Then in test.sh can we do something like <br>
> <br>
> #!/bin/bash<br>
> trap 'kill $(jobs -p)' EXIT<br>
> <br>
> # Start the actual service<br>
> /opt/test/service &<br>
> PID=$!<br>
> <br>
> /bin/systemd-notify --ready<br>
> while(true); do<br>
>     FAIL=0<br>
>     kill -0 $PID<br>
>     if [[ $? -ne 0 ]]; then FAIL=1; fi<br>
> <br>
> #    curl <a href="http://localhost/test/" rel="noreferrer" target="_blank">http://localhost/test/</a><br>
> #    if [[ $? -ne 0 ]]; then FAIL=1; fi<br>
> <br>
> if [[ $FAIL -eq 0 ]]; then /bin/systemd-notify WATCHDOG=1; fi<br>
> <br>
>     sleep 1<br>
> done<br>
> <br>
> <br>
> On Fri, Jul 26, 2019 at 12:27 AM Reindl Harald <<a href="mailto:h.reindl@thelounge.net" target="_blank">h.reindl@thelounge.net</a><br>
> <mailto:<a href="mailto:h.reindl@thelounge.net" target="_blank">h.reindl@thelounge.net</a>>> wrote:<br>
> <br>
> <br>
> <br>
>     Am 25.07.19 um 20:38 schrieb Debraj Manna:<br>
>     > I have a service on a Ubuntu 16.04 which I use systemctl start, stop,<br>
>     > restart and status to control.<br>
>     ><br>
>     > One time the systemctl status returned active, but the application<br>
>     > "behind" the service responded http code different from 200.<br>
>     ><br>
>     > So I would like to restart the service when the http code is not 200.<br>
>     > Can some one let me know is there a way to achieve the same via<br>
>     systemd?<br>
> <br>
>     nope, just write a seperate service with a little curl magic and<br>
>     "systemctl condrestart" and remember that you have to avoid premature<br>
>     restarts just because of a little load peak<br>
_______________________________________________<br>
systemd-devel mailing list<br>
<a href="mailto:systemd-devel@lists.freedesktop.org" target="_blank">systemd-devel@lists.freedesktop.org</a><br>
<a href="https://lists.freedesktop.org/mailman/listinfo/systemd-devel" rel="noreferrer" target="_blank">https://lists.freedesktop.org/mailman/listinfo/systemd-devel</a></blockquote></div>