Docker가 아닌 프로세스 필터링 및 종료

Docker가 아닌 프로세스 필터링 및 종료

로컬 및 동일한 호스트의 도커 컨테이너에서 일부 프로세스가 실행되고 있습니다. 동일한 이름을 가진 여러 프로세스를 실행하므로 호스트에서 실행 중인 모든 프로세스를 종료하고 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 pidbash 내장 변수와 잘 결합하면 $$현재 쉘의 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)를 참조하십시오.

관련 정보