일부 사용자 환경에서는 특정 성능 테스트 중에 로그인하고 해당 환경에서 실행 중인 모든 프로세스를 종료해야 합니다.
환경 이름은 rswrk01
,...to 와 같습니다 rswrk98
. 이것이 우리가 로그인하는 방법입니다.
sudo su - rswrk96
비밀번호를 묻는 메시지가 표시되지 않고 직접 로그인됩니다.
수동으로 로그인하여 프로세스를 종료하는 대신 모든 환경에서 실행 중인 모든 프로세스를 종료하는 스크립트를 자동으로 작성할 수 있습니까?
그런데 저는 루트가 아닙니다.
$ uname -a
HP-UX rcihp145 B.11.23 U 9000/800 3683851961 unlimited-user license
답변1
sudo -u rswrk96 -i killall ...
su - rswrk96
이는 다음과 동일해야 합니다 killall ...
.
이제 남은 것은 시퀀스 00-96을 생성하는 것뿐입니다. 이것은 작동합니다:
for i in $(seq -w 00 96); do sudo -u rswrk$i -i killall ...; done
지금 생각해보면 넌 할 수 있을 것 같아
for i in $(seq -w 00 96); do sudo killall -u rswrk$i; done
로그인이 필요하지 않습니다.
답변2
so rswrk01
와 co는 사용자입니다. 가끔 유용하다kill
즉, PID로 -1을 전달하면 신호 전송자가 신호 전송 권한을 가진 모든 프로세스에 신호가 전송됩니다. 즉, 루트가 아닌 사용자의 경우 kill -$sig -1
해당 사용자로 실행 중인 모든 프로세스에 신호가 전송됩니다. 여기에는 킬러가 포함되지만 전달은 원자적이므로 모든 관련 프로세스가 신호를 수신합니다.
이제 당신이 해야 할 일은 그것을 루프에 넣는 것뿐입니다. 그러면 작업이 완료됩니다. 앞에 0을 사용하여 숫자 형식을 지정하는 것은 다소 번거롭기 때문에 덜 예쁘지만 편리한 방법은 앞에 0을 넣고 1
(즉, 1에서 98 대신 101에서 198까지) 이를 제거하는 것입니다.
i=101
while [ $i -le 98 ]; do
sudo su - rswrk${i#1} kill -KILL -1
i=$((i+1))
done
또는 ksh로 표현됩니다.
for ((i=101; i<=198; i++)); do
sudo su - rswrk${i#1} kill -KILL -1
done
또는 bash나 zsh에서:
for i in {01..98}; do
sudo su - rswrk$i kill -KILL -1
done
답변3
kill -9 -1
명령을 실행하는 사용자를 대신하여 실행 중인 모든 프로세스, 심지어 쉘까지 실행 취소합니다. sudo를 사용하여 다른 사용자의 프로세스를 종료할 수 있습니다.
sudo -u user1 kill -9 -1
아니면 단순히 -u
플래그를 사용하여 pkill
명령을 내리세요.