Am 27.05.2016 um 06:48 schrieb Thomas Güttler:
OK, I understand that I need different tool to restart a service
if a check-script fails.

In my case the check script will be custom code. But the restart stuff
is very general and reusable:

 Step1: Call check-script
 Step2: If exit 0 (meaning service is working), then wait N seconds, got
to Step1
 Step3: Service is not working: Send process the signal TERM_SIGNAL
(should be configurable)
 Step4: Wait N seconds until process terminated.
 Step5: If process did terminate, restart the service. Wait, go to Step1
 Step6: Process did not terminate: Wait N seconds, Send signal KILL
 Step7: Wait until OS has cleaned up the service
 Step8: Restart the service, Wait, got to Step1

I could implement these steps myself, but I am lazy. I guess this
has already been done several times before.

Any tool recommendation?

that are just a few lines code in any programming language

your logic is way too complex - just SIGTERM and SIGKILL the service and a proper configured systemd-unit with "Restart=always" will automatically restarted when you shoot the main process in the head

also; if the service was *manually* stopped it will keep stopped because the kill-calls won't do anything
_________________________

[root@testserver:~]$ cat /etc/systemd/system/monitor-dbmail-lmtpd.service
[Unit]
Description=monitor dbmail-lmtpd
After=dbmail-lmtpd.service

[Service]
Type=simple
ExecStart=/usr/local/bin/check-dbmail-service.php 24 dbmail-lmtpd
Restart=always
RestartSec=1
TimeoutSec=5
Nice=19
IOSchedulingClass=3
User=dbmail
Group=dbmail
PrivateTmp=yes
PrivateDevices=yes
NoNewPrivileges=yes
CapabilityBoundingSet=CAP_KILL
ReadOnlyDirectories=/etc
ReadOnlyDirectories=/usr




[Install]

WantedBy=multi-user.target
________________________________________



[root@testserver:~]$ cat /usr/local/bin/check-dbmail-service.php

#!/usr/bin/php

<?php

 /** make sure we are running as shell-script */
 if(PHP_SAPI != 'cli')
 {
  exit('FORBIDDEN');
 }

 /** verify that port and binary-name are given */
 if(empty($_SERVER['argv'][1]) || empty($_SERVER['argv'][2]))
 {
  exit('USAGE: check-dbmail-service <port> <process-name>' . "\n");
 }

 /** delay monitoring for 30 seconds */
 sleep(30);

 /** service loop */
 while(1 == 1)
 {
  if(!check_service())
  {
   sleep(5);
   if(!check_service())
   {
passthru('/usr/bin/killall -s SIGTERM ' . escapeshellarg($_SERVER['argv'][2]));
    usleep(750000);
passthru('/usr/bin/killall -s SIGKILL ' . escapeshellarg($_SERVER['argv'][2]));
   }
  }
  sleep(30);
 }

 /**
  * check if service is available and responds
  *
  * @access public
  * @return boolean
 */
 function check_service()
 {
  $errno  = 0;
  $errstr = '';
$fp = @fsockopen('tcp://127.0.0.1', $_SERVER['argv'][1], $errno, $errstr, /**$timeout*/5);
  if($fp)
  {
   $response = @fgets($fp, 128);
   @fclose($fp);
   if(!empty($response))
   {
    return true;
   }
   else
   {
    return false;
   }
  }
  else
  {
   return false;
  }
 }
?>



Attachment: signature.asc
Description: OpenPGP digital signature

_______________________________________________
systemd-devel mailing list
systemd-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/systemd-devel

Reply via email to