#! /usr/bin/tcsh -f
set ps_output = "`ps -u $user`"
@ i = 2
echo "$ps_output"
set ps_test
while ( $i <= $#ps_output )
set line = ( $ps_output[$i] )
if ( $line[4] != "ps" && $line[4] != "tcsh" && $line[4] != "zap" ) then
set ps_test = ( $ps_test $i )
endif
@ i ++
end
foreach i ( $ps_test )
set line = ( $ps_output[$i] )
set process_no = $line[1]
if ( $line[4] == "HAL9000" || $line[4] == "HALos" || $line[4] == "HALshell" || $line[4] == "HALkeyboardDriv" || $line[4] == "HALdisplayDrive" || $line[4] == "HALdiskDriver" ) then
kill -9 $process_no
endif
end
exit 0
그래서 스크립트에서 설정 불일치 오류가 계속 발생하지만 어떤 설정이 원인인지 찾을 수 없습니다. 주석을 달더라도
set ps_test
여전히 설정 불일치 오류가 발생합니다. 이 문제를 해결할 수 있는 방법이 있습니까?
답변1
set
첫 번째 루프에서 이 오류가 발생합니다.
set line = ( $ps_output[$i] )
...출력에 ps
셸의 와일드카드 패턴과 일치하지 않는 단어가 포함된 경우(예: ??
두 문자로 된 파일 이름을 가진 파일이 현재 디렉터리에 없는 경우)
원하는 것을 수행하는 더 나은 (더 안전한) 방법은 다음 pkill
과 같이 사용하는 것입니다.Craig Small이 답변에 표시됨또는 약간 더 읽기 쉽습니다.
pkill -x -u $user HAL9000 HALos HALshell HALkeyboardDrv HALdisplayDrive HALdiskDriver
( -x
이름의 하위 문자열뿐만 아니라 전체 명령 이름이 정확히 일치하도록 강제) 또는 간단히
pkill -u $user '^HAL'
HAL
이름이 user 에 속한 하위 문자열로 시작하는 모든 프로세스에 신호를 보냅니다 $user
.
관련된:
답변2
또 다른 방법은 명령줄이나 스크립트의 줄에서 pkill을 사용하는 것입니다.
pkill -9 -u $USER '(HAL9000|HALos|HALshell|HALkeyboardDrv||HALdisplayDrive|HALdiskDriver)'