고급 프로세스 종료 옵션
이 단계에서는 보다 정교한 프로세스 관리를 가능하게 하는 pkill 명령어의 고급 옵션들을 살펴보겠습니다.
다양한 시그널 유형 사용하기
기본적으로 pkill은 프로세스에 SIGTERM 시그널 (시그널 15) 을 보냅니다. 이 시그널은 프로세스가 파일을 닫고 정리 작업을 수행하며 우아하게 (gracefully) 종료할 수 있도록 허용합니다. 하지만 다른 시그널을 사용해야 하는 경우도 있습니다.
시그널을 처리하는 스크립트를 생성해 보겠습니다:
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) 명령어 치환 (command substitution) 은 현재 사용자 이름을 가져옵니다.
모든 프로세스가 종료되었는지 확인합니다:
ps aux | grep rogue_app.sh
출력에는 grep 명령어 자체만 보여야 합니다.
이처럼 소유자별로 프로세스를 대상으로 지정하는 기능은 다른 사용자의 프로세스에 영향을 미치지 않으려는 다중 사용자 환경에서 특히 유용합니다.