как мне заставить процесс перезагрузиться в Linux?

StackOverflow https://stackoverflow.com/questions/627319

Вопрос

У меня есть сервис, скажем foo, написанный на C ++, который запускается от имени root.Существует обычный scrip, /etc/init.d/foo start|stop|restart .

В определенное время foo необходимо перезагрузить себя.Обычно после завершения обновления.Но делать такие вещи, как:

system("/etc/init.d/foo restart")

не работает, поскольку, как только restart завершает foo, вызов system(), очевидно, также завершается, и сценарий перезапуска никогда не выполняется до завершения.

Есть ли другой вызов, который я могу использовать вместо system(), который выполняется асинхронно как побратим вызывающего процесса, вместо создания синхронного дочернего элемента?

Спасибо!

Это было полезно?

Решение

Рассматривали ли вы exec[*] семья уже есть?Вот один из них -- execve.

Другие советы

Вы могли бы поместить это в inittab и позволить init беспокоиться о перезапуске процесса, когда он завершится по какой-либо причине.Это также позаботилось бы об автоматических перезапусках, если бы ваш процесс произошел сбой или assert() или иным образом неожиданно завершился.

Затем, чтобы обработать ваш вариант использования, процесс просто завершит сам себя.

как насчет fork(), за которым следует exec()?

Рассмотрите возможность внедрения

/etc/init.d/foo reload

для вашего демона (довольно стандартный, судя по grep моего окна Debian).

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

Если процесс знает, что ему нужно перезагрузиться, он может просто подать сигнал самому себе.

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

Объединяя два ответа до сих пор, используйте форк-исполнитель.

Чтобы добавить к тому, что Ori уже сказал, некоторые дистрибутивы Linux все еще используют initab, но Ubuntu и, возможно, другие перешли на /etc/event.d.Вы помещаете туда файл (копируете и редактируете один из существующих), затем запускаете демон с помощью "sudo start ssh_tunnel" или как там называется ваш файл.

Затем, когда вам понадобится его перезапустить, вы можете просто отключить его сигналом, и система перезапустит его.Или он мог бы сам решить, что пришло время перезапустить, вызвав "exit(0);" или что-то еще.

exec*() само по себе в исходной командной строке должно получиться то же самое.Вероятно, вы можете опустить форк, потому что тогда у вас будут запущены две копии, которые вам не нужны, и исходная копия затем должна завершиться.

Но также посмотрите на inittab и event.d в зависимости от вашего дистрибутива, чтобы увидеть, будет ли он лучше выполнять то, что вам нужно.

Третья возможность того, что предложили Ори и Пол, заключалась бы в использовании daemontools.Он более портативен, хотя и с меньшей вероятностью будет доступен.Вы создаете скрипт с именем /service/foo/run, и daemontools будет перезапускать ваш сервис всякий раз, когда он завершает работу.

http://cr.yp.to/daemontools.html

Посмотрите на справочную страницу для inittab.

В нем описывается, как система автоматически перезапустит ваши процессы, если она умрет (возродится).

При правильной настройке все, что вам нужно сделать, это завершить работу службы, и система автоматически позаботится о повторном запуске (возрождении) для вас.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top