awk 도구를 사용하여 여러 프로세스 종료

awk 도구를 사용하여 여러 프로세스 종료

awk를 사용하여 여러 프로세스를 중지하고 싶습니다. 내 명령은 다음과 같습니다

sudo ps -ef|grep wget |grep -v grep|awk '{print $2;sudo kill -STOP $2}'

wget을 실행 중인 모든 프로세스를 중지하고 싶습니다. awk의 $2는 각 프로세스의 pid를 나타냅니다. 그러나 나는 그것이 작동하지 않는다는 것을 알았습니다. 프로세스 상태는 변경되지 않습니다. 그들은 아직도 달리고 있습니다.

대신 다음 명령을 수정했습니다.

sudo ps -ef|grep wget |grep -v grep|awk '{print $2}'|xargs sudo kill -STOP

효과가있다! 그렇다면 누가 그들 사이의 차이점을 말해 줄 수 있습니까?

답변1

귀하의 방법에는 부족한 점이 많습니다.

  1. 대부분의 시스템에서는( /proc설치되지 않은 경우) 권한이 hidepid필요하지 않습니다 .rootps

  2. grep프로세스 목록의 첫 번째 인스턴스를 삭제하는 데 두 개의 인스턴스가 필요하지 않습니다. 대신 이렇게 하세요:grep '[w]get'

  3. grep입력을 필터링하는 것은 쓸모가 없습니다 awk. awk이 작업은 스스로 훌륭하게 수행할 수 있습니다. ( awk '/wget/ {print $2}'또는 ps질문 으로 인해 awk '/[w]get/ {print $2}':)

  4. ps출력을 필터링 하고 PID를 전달하는 대신 다음 명령을 사용할 수 있습니다.killkillall wget

  5. sudo한 번만 호출하는 대신 각 입력 라인에 대해 한 번만 호출하게 됩니다 .awk

첫 번째 파이프라인의 주요 문제는 awk다음 명령 입니다 awk '{print $2;sudo kill -STOP $2}'. 외부 명령을 실행할 수 있지만 이 방법으로는 실행할 수 awk없습니다. 다음 awk기능 이 필요합니다 .system(cmd-line)

사용하려면 ps다음 kill을 수행하십시오.

kill -STOP $(ps -ef | awk '/[w]get/ {print $2}')

답변2

귀하의 질문이 귀하가 시도한 두 명령의 차이점에 관한 것이라는 것을 알고 있지만, 그 문제에 얽매이지 않고 awk이 게시물을 우연히 발견할 수 있는 다른 사람들을 위해 대안은 를 사용하는 것입니다 pgrep -f.

kill $(pgrep -f wget)

이렇게 하면 사용 중인 모든 프로세스가 종료됩니다 wget. 사용하려는 신호를 사용하십시오 kill(가능한 경우).

답변3

개선 사항은 다음을 참조하세요.@Hauke ​​Laging의 답변.

솔루션 간의 차이점과 관련하여 첫 번째 방법은 kill명령을 실행하지 않고 , 및 4개의 변수만 참조합니다 sudo.killSTOP$2

적어도 에서는 gawk명령문에서 연산 없이 변수를 참조하면 아무 작업도 수행되지 않습니다. 다음을 사용하여 쉽게 dgawk볼 수 있습니다.

$ dgawk -f test.awk
dgawk> trace on
dgawk> run
Starting program: 
[     1:0x7f8d697fffe0] Op_rule             : [in_rule = BEGIN] [source_file = test.awk]
[     2:0x7f8d697fef60] Op_push_i           : 2 [PERM|NUMCUR|NUMBER]
[     2:0x7f8d697fef40] Op_field_spec       : 
[     2:0x7f8d697fef20] Op_K_print          : [expr_count = 1] [redir_type = ""]

[     2:0x7f8d697fefa0] Op_push             : sudo
[     2:0x7f8d697fefc0] Op_push             : kill
[     2:0x7f8d697ff040] Op_push             : STOP
[     2:0x7f8d697ff000] Op_minus            : 
[      :0x7f8d697ff080] Op_no_op            : 
[     2:0x7f8d697ff020] Op_push_i           : 2 [PERM|NUMCUR|NUMBER]
[     2:0x7f8d697ff060] Op_field_spec       : 
[      :0x7f8d697ff0c0] Op_concat           : [expr_count = 3] [concat_flag = 0]
[      :0x7f8d697ff0a0] Op_pop              : 
[      :0x7f8d697fee80] Op_no_op            : 
[      :0x7f8d697fef00] Op_atexit           : 
[      :0x7f8d697fefe0] Op_stop             : 
Program exited normally with exit value: 0

Op_no_op바이트코드 에 주의하세요 .

거기에서 외부 명령을 실행하려면 awk다음을 사용할 수 있습니다.awk 체계()기능:

awk '{print $2;system("sudo kill -STOP " $2)}'

관련 정보