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
귀하의 방법에는 부족한 점이 많습니다.
대부분의 시스템에서는(
/proc
설치되지 않은 경우) 권한이hidepid
필요하지 않습니다 .root
ps
grep
프로세스 목록의 첫 번째 인스턴스를 삭제하는 데 두 개의 인스턴스가 필요하지 않습니다. 대신 이렇게 하세요:grep '[w]get'
grep
입력을 필터링하는 것은 쓸모가 없습니다awk
.awk
이 작업은 스스로 훌륭하게 수행할 수 있습니다. (awk '/wget/ {print $2}'
또는ps
질문 으로 인해awk '/[w]get/ {print $2}'
:)ps
출력을 필터링 하고 PID를 전달하는 대신 다음 명령을 사용할 수 있습니다.kill
killall wget
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
.kill
STOP
$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)}'