В прошлой теме я показал как делать демонов старой школы - серьезных и самодостаточных. Но это все в прошлом. Теперь существуют системы управления процессами, где все намного, намного проще.
Заметьте, теперь никаких потоков, все элементарно, systemd сделает всю работу за нас.
Половина кода - разбор параметров командной строки. Вторая половина - бесконечный цикл, ожидающий сигналов от экземпляра класса демона нового стиля . Код самого класса сократился на треть.
Если запустите приложения в консоли - будет самое обычное приложение, которые умрет при закрытии консоли. Запуск в качестве бессмертного демона - через systemd, причем он сможет автоматически перезапускать вашего демона при крахе. Эти параметры задаются в текстовом файле /etc/systemd/system/DaemonNewStyleTest.service
program DaemonNewStyleTest;
{$APPTYPE CONSOLE}
uses
System.SysUtils,
System.IOUtils,
System.SyncObjs,
Posix.Stdlib,
Posix.SysStat,
Posix.SysTypes,
Posix.Unistd,
Posix.Signal,
Posix.Fcntl,
Posix.Syslog in 'Posix.Syslog.pas',
UnitDaemonNewStyle in 'UnitDaemonNewStyle.pas';
var
AEvent : TEventType;
begin
if ParamCount = 0 then
begin
syslog(LOG_ERR, 'No parameters');
ExitCode := EXIT_FAILURE;
exit;
end;
if ParamStr(1).ToLower.Equals('stop') then
begin
if Daemon.Stop(30) then
ExitCode := EXIT_SUCCESS
else
ExitCode := EXIT_FAILURE;
exit;
end;
if ParamStr(1).ToLower.Equals('reload') then
begin
if Daemon.Reload() then
ExitCode := EXIT_SUCCESS
else
ExitCode := EXIT_FAILURE;
exit;
end;
if not ParamStr(1).ToLower.Equals('start') then
begin
syslog(LOG_ERR, 'Unknow parameters');
ExitCode := EXIT_FAILURE;
exit;
end;
syslog(LOG_NOTICE, 'main START');
while Daemon.IsRunning do
begin
syslog(LOG_NOTICE, 'main LOOP');
Daemon.Execute(AEvent);
if AEvent <> TEventType.None then
syslog(LOG_NOTICE, 'main Daemon receive signal');
case AEvent of
TEventType.Start :
begin
syslog(LOG_NOTICE, 'main Event START');
end;
TEventType.Reload :
begin
// Reload config
syslog(LOG_NOTICE, 'main Event RELOAD');
end;
TEventType.Stop :
begin
syslog(LOG_NOTICE, 'main Event STOP');
ExitCode := EXIT_SUCCESS;
Sleep(10); // simulate destroy delay
break;
end;
end;
Sleep(1000);
end;
end.
Вопрос
Евгений Корепов
В прошлой теме я показал как делать демонов старой школы - серьезных и самодостаточных. Но это все в прошлом. Теперь существуют системы управления процессами, где все намного, намного проще.
Исходники тут https://github.com/EvgeniyKorepov/LinuxDaemonNewStyle
Заметьте, теперь никаких потоков, все элементарно, systemd сделает всю работу за нас.
Половина кода - разбор параметров командной строки. Вторая половина - бесконечный цикл, ожидающий сигналов от экземпляра класса демона нового стиля . Код самого класса сократился на треть.
Если запустите приложения в консоли - будет самое обычное приложение, которые умрет при закрытии консоли. Запуск в качестве бессмертного демона - через systemd, причем он сможет автоматически перезапускать вашего демона при крахе. Эти параметры задаются в текстовом файле /etc/systemd/system/DaemonNewStyleTest.service
program DaemonNewStyleTest; {$APPTYPE CONSOLE} uses System.SysUtils, System.IOUtils, System.SyncObjs, Posix.Stdlib, Posix.SysStat, Posix.SysTypes, Posix.Unistd, Posix.Signal, Posix.Fcntl, Posix.Syslog in 'Posix.Syslog.pas', UnitDaemonNewStyle in 'UnitDaemonNewStyle.pas'; var AEvent : TEventType; begin if ParamCount = 0 then begin syslog(LOG_ERR, 'No parameters'); ExitCode := EXIT_FAILURE; exit; end; if ParamStr(1).ToLower.Equals('stop') then begin if Daemon.Stop(30) then ExitCode := EXIT_SUCCESS else ExitCode := EXIT_FAILURE; exit; end; if ParamStr(1).ToLower.Equals('reload') then begin if Daemon.Reload() then ExitCode := EXIT_SUCCESS else ExitCode := EXIT_FAILURE; exit; end; if not ParamStr(1).ToLower.Equals('start') then begin syslog(LOG_ERR, 'Unknow parameters'); ExitCode := EXIT_FAILURE; exit; end; syslog(LOG_NOTICE, 'main START'); while Daemon.IsRunning do begin syslog(LOG_NOTICE, 'main LOOP'); Daemon.Execute(AEvent); if AEvent <> TEventType.None then syslog(LOG_NOTICE, 'main Daemon receive signal'); case AEvent of TEventType.Start : begin syslog(LOG_NOTICE, 'main Event START'); end; TEventType.Reload : begin // Reload config syslog(LOG_NOTICE, 'main Event RELOAD'); end; TEventType.Stop : begin syslog(LOG_NOTICE, 'main Event STOP'); ExitCode := EXIT_SUCCESS; Sleep(10); // simulate destroy delay break; end; end; Sleep(1000); end; end.
systemctl start DaemonNewStyleTest.service systemctl reload DaemonNewStyleTest.service systemctl stop DaemonNewStyleTest.service
Ссылка на комментарий
0 ответов на этот вопрос
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.