2013-06-14 2 views
0
/bin/sh -version 
GNU sh, version 1.14.7(1) 

exitfn() { 
      # Resore signal handling for SIGINT 
    echo "exiting with trap" >> /tmp/logfile 
    rm -f /var/run/lockfile.pid # Growl at user, 
    exit      # then exit script. 
} 
trap 'exitfn; exit' SIGINT SIGQUIT SIGTERM SIGKILL SIGHUP 

Вышеупомянутая функция - это сценарий оболочки.проблема завершения процесса сценария оболочки

Я хочу назвать его в некоторых специальных условиях ... как когда:

  1. «убить -9» пожары на PID этого сценария
  2. «Ctrl + Z» нажмите в то время как он работает на -x режиме
  3. сервер перезагружается в то время как сценарий выполняется ..

Короче говоря, с любым типом прерывания в сценарии, должны делать какие-то действия например. rm -f /var/run/lockfile.pid , но моя функция выше не работает должным образом; он работает только для закрытия терминала или «ctrl + c»

Не предлагайте обновить версию «bash/sh».

+1

Вы не можете захватить сигнал 9. – tripleee

+0

Что означает «работает на -x режиме»? Возможно, вы хотите, чтобы ловушка срабатывала только тогда, когда флаги оболочки включали '-x'? Это можно сделать внутри ловушки с 'case $ - in * x *) echo Shell имеет -x ;; esac' – tripleee

+0

Когда происходит контролируемая перезагрузка, 'init' отправляет регулярный сигнал« HUP », который может быть захвачен обычными средствами. Очевидно, нет возможности обнаружить неконтролируемую перезагрузку. – tripleee

ответ

1

SIGKILL не может быть захвачен командой trap или любым процессом. Это гарантированный сигнал об уничтожении, который по определению не может быть захвачен. Таким образом, модернизация вас sh/bash не будет работать.

1

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

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

Что касается CTRL-Z, это также дает вам сигнал SIGSTOP из памяти, поэтому вы можете добавить это. Хотя обычно это не было бы причиной для закрытия вашего процесса, поскольку он может быть затем помещен в фоновом режиме и перезапущен (с bg).


касается того, что делать делать для тех ситуаций, когда процесс умирает без catchable сигнала (например, в случае), программа должна проверить, что при запуске.

Под этим я имею в виду, что lockfile.pid должен хранить фактический PID процесса, который его создал (например, с помощью echo $$ >/var/run/myprog_lockfile.pid), и, если вы попытаетесь запустить свою программу, он должен проверить наличие этого процесса.

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

+0

, так как хранить исходный pid в этом файле? и затем я могу заставить скрипт выполнять только один и тот же pid только ... –

+0

@ user95711, он, вероятно, уже делает это, поскольку это, в конце концов, pidfile. Тем не менее, я обновил ответ, чтобы показать, как скрипт будет это делать. – paxdiablo

Смежные вопросы