2011-01-27 1 views
2

Я получаю доступ к веб-серверу через PHP. Я хочу обновить некоторую информацию в конфигурациях Apache, поэтому я запускаю сценарий оболочки, который вносит изменения. Затем я хочу остановить и перезапустить Apache.Скрипт оболочки Fork (не &)

Проблема: как только я останавливаю Apache, мой процесс останавливается, и мой скрипт оболочки, будучи дочерним процессом, убит. Apache никогда не перезапускается. Это также происходит при перезапуске Apache.

Есть ли способ развернуть независимый, не-дочерний процесс для сценария оболочки, поэтому я могу перезапустить Apache?

Thx, Mr B

+1

Что это за команда? '/etc/init.d/apache2 stop'? Может быть, вы можете использовать '/etc/init.d/apache2 restart'? PS. кому предложили то же самое с 'apachectl', не нужно удалять комментарий, потому что он похож на другой. – Benoit

+0

Возможно, также apachectl изящный может быть лучшим вариантом ... –

ответ

4

Вы можете использовать disown:

disown [-ar] [-h] [jobspec ...]

Без вариантов, каждый jobspec удаляется из таблицы активных заданий. Если задана опция -h, задание не удаляется из таблицы, но помечено так, что SIGHUP не отправляется на задание, если оболочка получает SIGHUP. Если jobspec нет, и не предоставляется опция `-a 'или` -r', используется текущее задание. Если параметр jobspec не указан, опция «-a» означает удаление или отметку всех заданий; опция «-r» без аргумента jobspec ограничивает операцию выполнением заданий.

./myscript.sh & 
disown 

./myscript.sh будет продолжать работать, даже если сценарий, который начал это умирает.

+0

Спасибо! Это сработало. – MrBubbles

+1

nohup делает то же самое, но в одной команде. – gpvos

+2

@gpvos для меня, disown чувствует себя чище, поскольку он избегает того, что SIGHUP отправляется в процесс вообще. nohup просто фильтрует этот сигнал и удерживает его в таблице рабочих мест. Кроме того, он выполняет некоторую перенаправление вывода, которая может не понадобиться. Наконец, я предпочитаю рекомендовать отказаться, так как это пригодится во время обычного использования bash время от времени ... но в принципе да, это то же самое. И './myscript & disown' выглядит как одна команда тоже;) – sfussenegger

1

Взгляните на nohup, может соответствовать вашим потребностям.

скажем, у вас есть сценарий под названием test.sh

for i in $(seq 100); do 
    echo $i >> test.temp 
    sleep 1; 
done 

если вы запустите поЬир ./test.sh & вы можете убить оболочку и процесс остаться в живых.