Продвинутые параметры завершения процессов
На этом этапе мы рассмотрим некоторые продвинутые параметры команды 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
позволяет нацеливаться на процессы на основе их времени жизни с использованием параметров --newer
и --older
.
Создадим несколько процессов с разными временами запуска:
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 &
touch ~/project/reference_time
Подождите несколько секунд, затем запустите еще два процесса:
sleep 5
~/project/age_test.sh &
~/project/age_test.sh &
Теперь завершим только те процессы, которые были запущены после создания файла-ссылки:
pkill -f --newer ~/project/reference_time 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
.
Возможность нацеливаться на процессы по владельцу особенно полезна в многопользовательских средах, когда вы хотите избежать влияния на процессы, принадлежащие другим пользователям.