실제 시나리오를 기반으로 다소 복잡한 예를 안내합니다.
문제
conky데스크탑 에서 명령 이 응답하지 않고 수동으로 종료하고 싶다고 가정 해 봅시다 . 나는 약간의 유닉스를 알고 있으므로 내가해야 할 일은 명령을 실행하는 것임을 알고 kill <PID>있습니다. PID를 검색하기 위해, 나는 사용 ps하거나 top또는 내 유닉스 분포 내게 주신 어떤 도구입니다. 그러나 하나의 명령으로 어떻게 이것을 할 수 있습니까?
대답
$ ps aux | grep conky | grep -v grep | awk '{print $2}' | xargs kill
면책 조항 :이 명령은 특정 경우에만 작동합니다. 터미널에 복사하거나 붙여 넣지 말고 사용을 시작하십시오. 오히려 그것을 구축하는 방법을 배우 십시오 .
작동 원리
1- ps aux
이 명령은 실행중인 프로세스 목록과 이에 대한 일부 정보를 출력합니다. 흥미로운 정보는 두 번째 열에 각 프로세스의 PID를 출력한다는 것입니다. 내 상자의 명령 출력에서 추출한 내용은 다음과 같습니다.
$ ps aux
rahmu 1925 0.0 0.1 129328 6112 ? S 11:55 0:06 tint2
rahmu 1931 0.0 0.3 154992 12108 ? S 11:55 0:00 volumeicon
rahmu 1933 0.1 0.2 134716 9460 ? S 11:55 0:24 parcellite
rahmu 1940 0.0 0.0 30416 3008 ? S 11:55 0:10 xcompmgr -cC -t-5 -l-5 -r4.2 -o.55 -D6
rahmu 1941 0.0 0.2 160336 8928 ? Ss 11:55 0:00 xfce4-power-manager
rahmu 1943 0.0 0.0 32792 1964 ? S 11:55 0:00 /usr/lib/xfconf/xfconfd
rahmu 1945 0.0 0.0 17584 1292 ? S 11:55 0:00 /usr/lib/gamin/gam_server
rahmu 1946 0.0 0.5 203016 19552 ? S 11:55 0:00 python /usr/bin/system-config-printer-applet
rahmu 1947 0.0 0.3 171840 12872 ? S 11:55 0:00 nm-applet --sm-disable
rahmu 1948 0.2 0.0 276000 3564 ? Sl 11:55 0:38 conky -q
2- grep conky
하나의 프로세스에만 관심이 있으므로 grep프로그램에 해당하는 항목을 찾는 데 사용 합니다 conky.
$ ps aux | grep conky
rahmu 1948 0.2 0.0 276000 3564 ? Sl 11:55 0:39 conky -q
rahmu 3233 0.0 0.0 7592 840 pts/1 S+ 16:55 0:00 grep conky
삼- grep -v grep
2 단계에서 볼 수 있듯이이 명령 ps은 grep conky프로세스를 목록으로 출력합니다 (결국 실행중인 프로세스 임). 필터링하기 위해 실행할 수 있습니다 grep -v grep. 이 옵션 -v은 패턴을 포함하는 grep라인을 제외한 모든 라인을 일치 시키도록 지시 합니다 .
$ ps aux | grep conky | grep -v grep
rahmu 1948 0.2 0.0 276000 3564 ? Sl 11:55 0:39 conky -q
NB : 한 번의 grep통화로 2 단계와 3 단계를 수행하는 방법을 알고 싶습니다 .
4- awk '{print $2}'
이제 목표 프로세스를 분리했습니다. PID를 검색하고 싶습니다. 즉, 출력의 두 번째 단어를 검색하고 싶습니다. 운 좋게도, 대부분의 (모두?) 현대식 유니 세서는 awk테이블 형식의 데이터로 놀라운 스크립트 언어 인 일부 버전을 제공 할 것 입니다. 우리의 임무는 다음과 같이 쉬워진다 print $2.
$ ps aux | grep conky | grep -v grep | awk '{print $2}'
1948
5- xargs kill
PID가 있습니다. 필요한 것은에 전달하는 것 kill입니다. 이를 위해을 사용 xargs합니다.
xargs kill입력으로부터 판독한다 (파이프에서 우리의 경우), 폼 명령 이루어진 kill <items>( <items>는 어떤 입력으로부터 판독되는)를 생성하고 명령을 실행한다. 우리의 경우에는 실행 kill 1948됩니다. 임무 완수.
마지막 단어
사용중인 유닉스 버전에 따라 특정 프로그램이 약간 다르게 동작 할 수 있습니다 (예 : ps$ 3 열에 PID를 출력 할 수 있음). 무언가 잘못되었거나 다르게 보이면 공급 업체의 설명서 (또는 더 나은 man페이지)를 읽으십시오 . 긴 파이프는 위험 할 수 있으므로주의하십시오. 같은 명령을 사용할 때 특히 어떤 가정을하지 마십시오 kill나 rm. 예를 들어, 'conky'(또는 'Aconkyous')라는 다른 사용자가 있으면 내 명령으로 실행중인 모든 프로세스도 종료 될 수 있습니다!
내가 말하는 것은 특히 긴 파이프에주의하십시오. 가정을하고 나중에 미안하다고 생각하는 것보다 여기에서 한 것처럼 대화식으로 작성하는 것이 좋습니다.