Расширенные параметры завершения процессов
На этом шаге мы рассмотрим некоторые расширенные опции команды pkill, которые позволяют более тонко управлять процессами.
Использование различных типов сигналов
По умолчанию pkill отправляет процессам сигнал SIGTERM (сигнал 15). Этот сигнал позволяет процессам корректно завершиться, закрыть файлы и выполнить операции очистки. Однако бывают случаи, когда вам может потребоваться использовать другой сигнал.
Давайте создадим скрипт, который обрабатывает сигналы:
cd ~/project
nano signal_handler.sh
Добавьте следующее содержимое в скрипт:
#!/bin/bash
trap 'echo "Received SIGHUP (1)"; exit 0' SIGHUP
trap 'echo "Received SIGINT (2)"; exit 0' SIGINT
trap 'echo "Received SIGTERM (15)"; exit 0' SIGTERM
echo "Process started with PID $$"
echo "Use: pkill -[signal] -f signal_handler.sh to send signals"
while true; do
sleep 1
done
Сделайте скрипт исполняемым:
chmod +x ~/project/signal_handler.sh
Запустите скрипт в фоновом режиме:
~/project/signal_handler.sh &
Теперь попробуем отправить различные сигналы процессу:
- Отправьте сигнал SIGHUP (сигнал 1):
pkill -HUP -f signal_handler.sh
- Снова запустите скрипт и отправьте SIGINT (сигнал 2):
~/project/signal_handler.sh &
pkill -INT -f signal_handler.sh
- Снова запустите скрипт и отправьте сигнал SIGTERM по умолчанию (сигнал 15):
~/project/signal_handler.sh &
pkill -f signal_handler.sh ## Default is SIGTERM
Для каждого сигнала вы должны увидеть соответствующее сообщение в выводе терминала перед завершением процесса.
Завершение процессов по возрасту
pkill позволяет выбирать процессы на основе времени их запуска с помощью опции --newest, которая выбирает самые недавно запущенные процессы.
Давайте создадим несколько процессов с разным временем запуска:
cd ~/project
nano age_test.sh
Добавьте следующее содержимое в скрипт:
#!/bin/bash
while true; do
echo "Process running with PID $$"
sleep 5
done
Сделайте скрипт исполняемым:
chmod +x ~/project/age_test.sh
Запустите первый процесс:
~/project/age_test.sh &
Подождите несколько секунд, затем запустите еще два процесса:
sleep 5
~/project/age_test.sh &
~/project/age_test.sh &
Теперь давайте завершим только два самых последних запущенных процесса, используя опцию --newest:
pkill -f --newest 2 age_test.sh
Проверьте, какие процессы все еще запущены:
ps aux | grep age_test.sh
Вы должны увидеть, что запущен только первый процесс, так как он был запущен раньше двух других.
Завершите оставшийся процесс:
pkill -f age_test.sh
Ограничение pkill по владельцу процесса
Вы также можете ограничить действия pkill процессами, принадлежащими определенному пользователю. В многопользовательской системе это особенно полезно.
Для демонстрации запустим несколько процессов от имени текущего пользователя:
~/project/rogue_app.sh &
~/project/rogue_app.sh &
Теперь давайте завершим эти процессы, но только те, которые принадлежат вашему текущему пользователю:
pkill -f -u $(whoami) rogue_app.sh
Опция -u указывает имя пользователя, которому принадлежит процесс. Команда $(whoami) подставляет ваше текущее имя пользователя.
Проверьте, что все процессы были завершены:
ps aux | grep rogue_app.sh
В выводе вы должны увидеть только саму команду grep.
Эта возможность выбирать процессы по владельцу особенно полезна в многопользовательских средах, где вы хотите избежать воздействия на процессы, принадлежащие другим пользователям.