유휴 사용자가 리소스를 많이 사용하는 일반적인 문제의 특정 인스턴스에 대한 솔루션을 구현하고 싶습니다. 을 사용하여 사용자 목록을 검색하고 w
, 을 사용하여 관련 PID를 검색하고 ps
, 를 사용하여 마지막 단계를 검색 할 수 있다는 것을 알고 있습니다 kill
. 하지만 한 시간 이상 유휴 상태인 사용자를 위해 이 프로세스를 자동화하고 싶습니다.
아이디어는 w의 출력을 한 줄씩 읽고 정규식 [0-9]m
(유휴 시간이 1분보다 긴 사용자 찾기)이 포함된 줄을 선택하는 것입니다. 그런 다음 라인과 연관된 TTY가 추출되어 으로 전송되며 ps -t
, 출력에는 전송될 PID 목록이 포함됩니다 kill -9
. 나는 그것을 모두 하나로 묶는 방법을 잘 모르겠습니다.
최종 경고: 루트 사용자와 관련된 내용은 해석되지 않습니다.
답변1
이를 위해서는 쉘 시간 초과를 사용하는 것이 더 나을 수 있습니다. bash 내보내기 TMOUT 변수의 경우 읽기 전용으로
TMOUT=<seconds>; readonly TMOUT; export TMOUT
tcsh에서 사용하기 위해
set -r autologout <seconds>
/etc/profile.d/의 스크립트에서. 위의 시간 초과에 도달한 쉘은 종료됩니다. "w"의 출력이 항상 정확하지는 않습니다(예: x 세션에 대한 시간을 보고하지 못함).
ssh를 통해 로그인하는 사용자가 있는 경우 ClientAliveInterval을 사용하십시오(sshd_config(5) 참조).
답변2
w는 tty의 액세스 시간을 사용하여 누군가가 얼마나 유휴 상태인지 확인합니다. 이는 tty 파일 수를 계산하고 현재 시간에서 atime을 빼는 Idletime()에서 다룹니다. pkill은 터미널을 필터로 사용하여 프로세스를 종료할 수 있습니다.
그럼, 루트가 아니고 5분 이상 유휴 상태인 사람을 죽이시겠습니까?
for t in `w -h | grep -v '^root' | awk '{print $2}'`; do find /dev/$t -amin +5 -exec pkill -t $t \; ; done
여기서 무슨 일이 일어나고 있나요?
- 제목 없이 w를 사용하여 모든 사용자 찾기
- 뿌리를 걸러내다
- 열 2의 tty를 인쇄합니다.
- 각 행을 찾아 액세스 시간이 5분을 초과하는지 테스트합니다.
- 그렇다면 pkill을 사용하여 해당 터미널의 모든 프로세스를 종료하십시오.