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 languageyour 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=/etcReadOnlyDirectories=/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;
}
}
?>
signature.asc
Description: OpenPGP digital signature
_______________________________________________ systemd-devel mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/systemd-devel
