Как определить команду ‘service stop’ в Linux

#c #linux #service

#c #linux #Обслуживание

Вопрос:

Я пишу приложение на C для управления светодиодной лентой на компьютере с Linux: приложение прослушивает порт сокета TCP для получения команд.
Если соединение прервано, приложение ожидает другого соединения.

Я запускаю это приложение как службу с помощью файла конфигурации systemd, и оно работает без сбоев.

Единственная проблема заключается в том, что когда компьютер перезагружается или выключается (или просто мне нужно перезапустить службу), служба прерывает любое соединение и задерживает отключение питания, ожидая истечения времени ожидания сокета. Я предполагаю, что он ожидает нового подключения..

Есть ли способ обнаружить команду ‘service stop’, просто чтобы избежать попадания в команду ‘wait for a connection’ и просто завершить работу приложения?

Комментарии:

1. Можете ли вы объяснить, что вы подразумеваете под «сервисом» здесь? Вы имеете в виду системную службу, управляемую init или systemd или что-то в этом роде? Или вы используете этот термин по-другому? Для системной службы обычным подходом было бы предоставить приложению механизм чистого завершения работы, который может вызвать диспетчер служб. Тогда приложение не нужно было бы уничтожать. В качестве альтернативы вы можете перехватить любой сигнал, который использует платформа, когда вы останавливаете службу, и закрыть приложение в обработчике сигналов. Но, на самом деле, это сложно, не зная точно, что вы подразумеваете под «сервисом»

2. Спасибо, я имею в виду приложение, определенное в файле /etc / systemd/system /my.service и управляемое командой systemctl. Когда я запускаю ее в командной строке, я дважды нажимаю Ctrl-C, чтобы закрыть ее.

3. Предоставили ли вы конкретный способ для systemd отключения вашей службы? Например, есть ли у вас конкретная команда для ExecStop ? Если вы хотите плавного и своевременного завершения работы, systemd необходимо знать, как завершить работу вашей службы. Однако фактическая реализация может быть сложной.

4. Нет, пока есть только ExecStart=/usr/local/bin/rpirgb и ExecReload=/bin/kill -HUP $MAINPID

5. Если вы генерируете сигналы самостоятельно, вы можете использовать все, что пожелаете 😉