Сценарии оболочки — как отправить сигнал процессам
Предварительные требования: процессы, сценарии Bash, библиотека функций оболочки.
Сигналы позволяют операционной системе взаимодействовать с программами (или процессами). Мы создадим интерактивный сценарий bash для отправки сигналов процессу и наблюдения за его состоянием. Для демонстрации мы будем использовать программу с именем xlogo, в которую мы будем отправлять сигналы из нашего скрипта bash. Это программа, которая отображает логотип системы X Window.
Установите xlogo, если его нет в вашей системе
$ sudo apt-get install x11-apps
Создание сценария оболочки
Имя скрипта будет signal.sh.
$ touch signals.sh
Сделайте его исполняемым файлом.
$ chmod +x signals.sh
Откройте файл и добавьте следующий скрипт.
#!/bin/bash # enabling job control in the script set -m # starting the program in background $1 & echo "$1 process started in background..." # storing the Process ID(PID) PID=`pgrep $1` while [[ true ]] do # print the job status echo "$(jobs -l)" # terminate the script echo "Do you want to continue?(y/n)" read CHOICE if [[ $CHOICE == "n" ]] then # send SIGHUP(hangup signal to process) kill -1 $PID echo "$(jobs -l)" break fi # restart the process if it has been terminated # checks whether PID exists or not. If not, it # creates new instance of the process if ! ps -p $PID > /dev/null ; then echo -e " Restarting $1 process which was terminated earlier" $1 & echo "$(jobs -l)" PID=`pgrep $1` fi # sending signal to the process via kill command echo -e " Enter Signal Number" read NUM kill -$NUM $PID; sleep 1; done
Он принимает имя допустимого процесса в качестве аргумента в терминале. Вход - это номер сигнала. Сигналы отправляются с помощью команды kill, а задания -l выводят статус процесса. Во время запуска скрипта, если мы завершим процесс, есть возможность перезапустить процесс.
Запустить скрипт
$ ./signals.sh xlogo
Вы увидите всплывающее маленькое окно с логотипом X на экране. Перетаскивая его и изменяя размер окна, логотип соответственно меняет форму, что означает, что программа работает правильно. Программа работает в фоновом режиме.
Нажмите y, чтобы продолжить, или n, чтобы выйти из скрипта.
Сигнал номер 19 соответствует сигналу SIGSTOP. Это своего рода пауза или зависание программы. Он используется, когда мы хотим остановить процесс, но не хотим его закрывать. Приглашение оболочки возвращается. Терминал показывает текущий статус процесса.
Мы видим, что размер логотипа X перестает изменяться при перетаскивании окна.
Отправка сигналов SIGSTOP(19), SIGCONT(18), SIGINT(2) и SIGHUP(1).
Список общих сигналов
Число | Имя | Значение |
---|---|---|
1 | ПОДПИСАТЬСЯ | Если процесс запускается с терминала, а сам терминал закрыт/завершен, то процесс получает этот сигнал и, следовательно, завершается. |
2 | ПОДПИСЬ | Он вежливо говорит программе завершить работу. Выполняет ту же функцию, что и Ctrl+C. Это зависит от процесса, будет ли он слушать его или нет. |
9 | СИГКИЛЛ | В отличие от других сигналов, сигнал SIGKILL никогда не отправляется процессу. Вместо этого терминал немедленно убивает программу, и программа не успевает сохранить свои данные или очистить свою работу. Используйте это только в крайнем случае. |
15 | SIGTERM | Это стандартный сигнал команды kill. |
18 | SIGCONT | Это восстановит процесс, который был приостановлен сигналом SIGSTOP или SIGTSTP. |
19 | SIGSTOP | Этот сигнал приостанавливает/замораживает процесс. Процесс не может игнорировать его. |
20 | SIGTSTP | Он похож на SIGSTOP, но процесс, получивший этот сигнал, не обязан его прослушивать. Процесс может предпочесть игнорировать его. |