리눅스 서버에 장기적으로 유지중인 터미널 접속 세션을 kill 하는 스크립티 입니다.
who -uH 명령어의 출력 결과(현재 세션 정보)를 가져와서 특정 기간 이상 유지 중인 세션을 찾고 해당 세션을 정상 종료 시키는 python 스크립트 입니다.
Python 코드
import subprocess
import os
from datetime import datetime, timedelta
def get_long_running_sessions():
try:
# who 명령어를 사용하여 현재 세션 정보 가져오기
result = subprocess.check_output(['who', '-uH'], text=True)
lines = result.splitlines()
# 1일 이상 유지 중인 세션 정보 찾기
long_running_sessions = []
for line in lines[1:]:
fields = line.split()
login_time_str = ' '.join(fields[2:4])
login_time = datetime.strptime(login_time_str, '%Y-%m-%d %H:%M')
# 현재 시간과의 차이 계산
time_difference = datetime.now() - login_time
# 1일 이상 세션을 유지한 경우 세션 정보 저장
if time_difference.days >= 1:
long_running_sessions.append({
'username': fields[0],
'terminal': fields[1],
'login_time': ' '.join(fields[2:4]),
'idle_time': fields[4],
'pid': fields[5],
'comment': fields[6],
})
# 24시간 이상 세션을 유지한 경우 세션 정보 저장
# if time_difference.total_seconds() >= 5 * 3600:
# long_running_sessions.append({
# 'username': fields[0],
# 'terminal': fields[1],
# 'login_time': ' '.join(fields[2:4]),
# 'idle_time': fields[4],
# 'pid': fields[5],
# 'comment': fields[6],
# })
return long_running_sessions
except subprocess.CalledProcessError as e:
print(f'Error getting sessions: {e}')
def kill_sessions(sessions):
try:
# 추출한 세션을 종료
for session in sessions:
os.systemm(f'kill -15 {session["pid"]}')
print(f'[{datetime.now()}] delete session : {session}')
except Exception as e:
print(f'Error killing sessions: {e}')
if __name__ == '__main__':
# 1일 이상 유지 중인 세션 정보 가져오기
long_running_sessions = get_long_running_sessions()
# 가져온 세션 정보 출력
for session in long_running_sessions:
print(f'[{datetime.now()}]')
print(session)
# 가져온 세션 정보를 종료
kill_sessions(long_running_sessions)