Остановка процесса в / etc / inittab убивает порожденный процесс. Не происходит в rc.local - PullRequest
1 голос
/ 04 июня 2010

Я пытаюсь выполнить обновление прошивки, когда мои программы запущены в inittab. Моя программа будет запускать 2 команды. Один для извлечения сценария установщика из архива, а другой для выполнения сценария установщика. В моем коде я использую вызов функции system (). Это 2 строки команд ниже,

   system ( "tar zvxf tarball.tar.gz -C / installer.sh 2>&1" );

   system( "nohup installer.sh tarball >/dev/null 2>&1 &" );

Скрипт установщика требует, чтобы tarball был аргументом. Я пытался использовать sudo, но у меня все та же проблема. Я попробовал nohup безуспешно. Сценарий установщика должен убить мою программу при обновлении прошивки, но сценарий установщика останется в живых.

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

Но мне нужно запустить мою программу из / etc / inittab, чтобы она могла возродиться, если умрет. Чтобы остановить мою программу в inittab, скрипт установщика хеширует ее и выполняет «telinit q». Это где моя программа умирает (но это то, что я хочу, чтобы она делала), но это также убивает мой установочный скрипт.

Кто-нибудь знает, почему это происходит и что я могу сделать, чтобы решить эту проблему?

Заранее спасибо.

1 Ответ

0 голосов
/ 05 июня 2010

Я предполагаю, что здесь происходит, что init отправляет SIGTERM / SIGKILL не только процессу, но и всей группе процессов. Это делает это, чтобы гарантировать, что все дочерние элементы процесса должным образом очищены. Когда ваша программа вызывает system (), она выполняет внутреннюю функцию fork () / exec (). Этот вновь разветвленный процесс находится в той же группе процессов, что и ваша программа, поэтому он также уничтожается.

Вы можете попробовать запустить скрипт установщика в новом сеансе, выполнив

system( "setsid nohup installer.sh tarball >/dev/null 2>&1 &" );

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

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