Вызов «start» для запуска программы и «stop» для закрытия текущего экземпляра в C - PullRequest
1 голос
/ 22 октября 2010

Я написал простой сервер на C и хотел бы иметь такую ​​же функциональность, вызывая его, как и другие демоны C (например, вызывать его с помощью ./ftpd, запускать и закрывать этот экземпляр с помощью ./ftpd stop). Очевидно, у меня проблема в том, что я не знаю, как получить текущий экземпляр запущенной программы. Я могу просто разобрать параметры (используя getopt / optarg), но в данный момент ./my-program stop просто запускает новый экземпляр вместо вызова ./my-program start, который запускает его нормально.

Причина, по которой я хочу это сделать, заключается в том, что другая программа будет сигнализировать моему серверу об остановке, поэтому вызов типа ./my-program stop очень прост, который может затем остановить циклы сервера и закрыть все открытые файлы. Спасибо!

Возможно ли это сделать в самой программе на C или это обычно обрабатывается извне?

Ответы [ 3 ]

2 голосов
/ 22 октября 2010

Посмотрите на команду killall. start внутри скрипта часто просто смотрит, существует ли экземпляр программы, и если он не запускает его. Остановка часто просто отправляет сигнал службе, используя команду killall.

Подобные вещи, которые могут вас заинтересовать, - это редактирование или замена файлов конфигурации для демона, а затем отправка демону сигнала SIGHUP, сообщающего ему, что он должен перечитать свою конфигурацию.

Еще одна связанная с этим тема - отправка демону конкретного сообщения путем вызова исполняемого файла демона с некоторыми конкретными параметрами. Это делается таким образом, потому что интерфейс, в который отправляются сообщения, может измениться, и, если это та же самая программа, которая отправляет и получает, трудно выйти из синхронизации. Способ отправки сообщений также может быть разным (Unix Domain Sockets, именованный канал, редактирование файла конфигурации и отправка SIGHUP, практически все, что вы можете себе представить). Еще одним преимуществом этого является то, что ту же проверку ввода, которую использует программа при запуске в качестве демона, можно использовать перед отправкой сообщения, поэтому в случае ошибки демон может задушить экземпляр программы, которой вы являетесь. вызов из командной строки может пойти дальше и сообщить вам на терминале и отказать в передаче этого демону.

Чтобы найти PID работающей службы, либо используйте файл pid (демон создает файл в определенном месте с его PID в нем - точно так же, как старые файлы блокировки, или делайте это так же, как killall - - просмотреть /proc (это зависит от платформы).

2 голосов
/ 22 октября 2010

Вы всегда будете запускать отдельный процесс при запуске с аргументом 'stop'.Вам нужно найти работающего демона и отправить ему сигнал, чтобы остановить его.Когда ваш демон запускается (опция 'start'), вы можете захотеть сохранить его pid где-нибудь, чтобы при запуске с опцией 'stop' он мог получить pid демона и отправить ему сигнал, чтобы остановить его.Вы также можете проанализировать таблицу процессов, чтобы найти своего демона, но это будет более сложным.

1 голос
/ 22 октября 2010

В большинстве дистрибутивов Linux, с которыми я сталкивался, демоны запускаются и останавливаются с помощью сценариев инициализации, а не путем прямого вызова.

Например, на моем Ubuntu box я могу запускать и останавливать wicd с помощью:

/ etc / init.d / wicd start /etc/init.d/wicd stop

... я думаю, это то, что вы хотите сделать.

Как отметили некоторые другие люди, чтобы остановить запущенный процесс, вам нужно где-то спрятать его PID, а затем использовать этот PID для отправки ему сигнала позже. Вы могли бы реализовать это самостоятельно в сценарии, но большинство дистрибутивов Linux предоставляют вспомогательные приложения, которые позаботятся об этом, например, за вас. start-stop-daemon (8) на платформах, производных от Debian (в дистрибутивах Redhat есть что-то похожее, но я не могу вспомнить имя приложения в голове).

Так что, если бы это был я, я бы написал сценарий для запуска и остановки вашего демона C, и я бы основывал этот сценарий на одном из других файлов в /etc/init.d, как указано выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...