로컬 및 동일한 호스트의 도커 컨테이너에서 일부 프로세스가 실행되고 있습니다. 동일한 이름을 가진 여러 프로세스를 실행하므로 호스트에서 실행 중인 모든 프로세스를 종료하고 docker에서 실행 중인 프로세스는 무시할 수 있는 별칭/함수를 만들고 싶습니다.
현재 사용 중인 명령의 형식은 다음과 같습니다.
kill $(ps aux | grep 'process_name' | awk '{print $2}')
나는 이 명령이 실행 중인 모든 컨테이너에서 동일한 이름을 가진 모든 프로세스를 종료하여 충돌을 일으켰다는 것을 확인했습니다. 이런 일이 발생하지 않도록 하려면 어떻게 해야 합니까?
다음은 호스트 시스템에서 프로세스가 나타나는 모습입니다(ps aux의 결과).
hamzam 9109 0.9 0.0 510912 24732 ? Ssl 14:21 0:00 python /opt/scripts/ex_script __name:=process_name __log:=/home/hamzam/.logs/0286c734-71fd-11e7-9dc4-901b0ed728a7/process_name-3.log
다음은 컨테이너 중 하나에서 실행되는 프로세스입니다.
hamzam 12168 2.3 0.0 472708 64312 ? Ssl 14:22 0:00 python /opt/scripts/ex_script __name:=process_name __log:=/home/logs/0/126e36dc-71fd-11e7-bd98-0242ac110003/process_name-3.log
답변1
pkill
종료가 영향을 미칠 네임스페이스를 제한하는 데 사용할 수 있는 옵션이 --ns pid
있습니다 .--nslist name...
--ns pid
bash 내장 변수와 잘 결합하면 $$
현재 쉘의 PID와 동일합니다.
예를 들어 내 시스템 중 하나에서 docker에서 gitlab 인스턴스를 실행하고 해당 컨테이너에서 실행되는 서비스 중 하나가 redis입니다.
# ps u -C redis-server
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
997 30006 0.1 0.0 35504 2896 ? Ssl 16:05 0:00 /opt/gitlab/embedded/bin/redis-server 127.0.0.1:0
PID 30006을 기록해 두십시오.
pkill의 옵션을 사용하면 -ns $$
내 쉘과 다른 네임스페이스에 있기 때문에 pkill이 종료되지 않습니다. PID는 변경되지 않았습니다. 이는 PID가 종료되거나 다시 시작되지 않았음을 나타냅니다.
# pkill --ns $$ redis-server
# ps u -C redis-server
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
997 30006 0.1 0.0 35504 2896 ? Ssl 16:05 0:00 /opt/gitlab/embedded/bin/redis-server 127.0.0.1:0
만약 내가아니요이 옵션을 사용하면 (놀랍지도 않게) 종료됩니다.
# pkill redis-server
# ps u -C redis-server
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
997 459 0.5 0.0 35504 2896 ? Ssl 16:11 0:00 /opt/gitlab/embedded/bin/redis-server 127.0.0.1:0
redis-server의 PID는 이제 459입니다. 종료되고 다시 시작되었습니다.
그런데 pgrep
동일한 옵션이 지원되므로 동일한 네임스페이스에 있는 다른 프로세스 목록을 쉽게 얻을 수 있습니다. 예를 들어, pgrep -a --ns 459
위의 redis-server와 동일한 네임스페이스에서 실행되는 모든 프로세스를 보여줍니다.
ps
네임스페이스 세부 정보를 표시하기 위한 다양한 출력 형식 옵션도 있습니다. 예를 들어:
# ps -o pidns,pid,cmd -C redis-server
PIDNS PID CMD
4026532661 459 /opt/gitlab/embedded/bin/redis-server 127.0.0.1:0
에서 man ps
:
PIDNS PIDNS
프로세스가 속한 네임스페이스의 고유한 inode 번호를 설명합니다. 네임스페이스(7)를 참조하십시오.