Как я могу перезагрузить системный демон? - PullRequest
2 голосов
/ 31 марта 2011

Мне нужно перезагрузить демон Squid, решение:

system("/etc/init.d/squid reload\n"); 

но я думаю, что должно быть более эффективное решение, чем использование "системного" вызова, какую инструкцию C я должен использовать?

Большое спасибо.

Ответы [ 2 ]

3 голосов
/ 31 марта 2011

Абсолютно самый быстрый способ перезагрузить свои конфигурационные файлы для Squid - это отправить демону SIGHUP с помощью kill(). Это то, что делает squid -k reconfigure, что, в свою очередь, то, что /etc/init.d/squid reload, скорее всего, делает.

Проблема с этим подходом заключается в том, что вам нужно каким-то образом обнаружить идентификатор процесса демона squid в вашем C-коде. PID обычно хранится в текстовом файле где-то под /var/run (/var/run/squid.pid в моем случае), который вы можете прочитать - это избавляет вас от необходимости просматривать таблицу процессов, но это все еще в некотором беспорядке .

Учитывая, что /etc/init.d/squid также может выполнять пользовательские операции и что вы не обязаны перезагружать демона каждую секунду или около того, я бы сказал, что вам следует использовать свое текущее решение. Если вас не волнует возвращаемое состояние скрипта, вы также можете использовать общий подход fork() и exec(), который является асинхронным и, следовательно, быстрее от Точка зрения вашего приложения.

2 голосов
/ 31 марта 2011

Вы можете использовать fork и exec, если вам действительно нужно более быстрое решение, но поскольку необходимо запустить сценарий инициализации squid и выполнить работу Squid, любая оптимизация вашей программы на C даст лишь незначительное улучшение.

EDIT:

С другой стороны (после просмотра руководства по Squid) некоторые демоны реагируют на сигналы, и Squid, похоже, делает это. Например, он перечитывает свои файлы конфигурации, если вы отправляете ему сигнал HUP:

kill(process-id-of-the-squid-dameon, SIGHUP);
...