如何自动清理系统中无运行任务的screen会话?
清理无活跃任务的Screen会话脚本方案
核心思路
要精准清理空闲Screen会话,关键是判断会话内是否存在正在运行的业务进程。每个Screen会话的主进程通常是shell,若该shell下没有子进程(仅自身运行),即可判定为无任务的空闲会话,可安全终止;反之则保留(比如运行长命令的screen3)。
实现脚本
创建可执行脚本clean_idle_screens.sh,内容如下:
#!/bin/bash # 指定需要清理的目标用户 TARGET_USERS=("user1" "user2") for USER in "${TARGET_USERS[@]}"; do # 获取该用户所有有效Screen会话(过滤掉提示行) screen_sessions=$(su - "$USER" -c "screen -list" | grep -E '^[0-9]+\.' | awk '{print $1}') for session in $screen_sessions; do # 拆分会话PID和名称(格式示例:1234.screen1) session_pid=$(echo "$session" | cut -d. -f1) session_name=$(echo "$session" | cut -d. -f2) # 统计会话主进程的子进程数量(仅保留进程ID计数) child_count=$(su - "$USER" -c "pstree -p $session_pid | grep -o '([0-9]\+)' | wc -l") # 子进程数<=1说明只有shell自身,判定为空闲会话并终止 if [ "$child_count" -le 1 ]; then su - "$USER" -c "screen -S $session -X quit" echo "[$(date '+%Y-%m-%d %H:%M:%S')] 清理用户$USER的空闲会话: $session_name (PID: $session_pid)" >> /var/log/idle_screen_cleanup.log fi done done
脚本细节说明
- 用户范围控制:通过
TARGET_USERS数组指定要处理的user1和user2,按需调整。 - 会话枚举:用
screen -list配合过滤,精准获取用户的所有活跃会话。 - 空闲判定:借助
pstree检查会话主进程的子进程数量,避免误杀有后台任务的会话。 - 优雅终止:使用
screen -X quit命令关闭会话,比强制kill更安全,不会中断会话内的活跃进程。 - 日志记录:操作日志写入
/var/log/idle_screen_cleanup.log,方便回溯清理记录。
配置自动执行(Crontab)
- 给脚本添加执行权限:
chmod +x /opt/scripts/clean_idle_screens.sh
- 编辑root用户的crontab(需切换到目标用户执行命令):
crontab -e
- 添加定时规则(示例:每小时执行一次):
0 * * * * /opt/scripts/clean_idle_screens.sh
注意事项
- 先手动测试脚本:执行后检查目标用户的会话状态和日志,确认不会误杀活跃会话。
- 特殊场景兼容:若会话内有后台运行的
nohup、&进程,pstree会识别到子进程,不会被清理。 - 权限验证:确保root用户能正常切换到目标用户执行
screen命令,目标用户的Screen配置无特殊限制。
内容的提问来源于stack exchange,提问作者Luca Moscato
相关产品推荐
相关产品推荐

