Сценарии оболочки — как отправить сигнал процессам

Опубликовано: 25 Сентября, 2022

Предварительные требования: процессы, сценарии 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, но процесс, получивший этот сигнал, не обязан его прослушивать. Процесс может предпочесть игнорировать его.