You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何自动清理系统中无运行任务的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)

  1. 给脚本添加执行权限:
chmod +x /opt/scripts/clean_idle_screens.sh
  1. 编辑root用户的crontab(需切换到目标用户执行命令):
crontab -e
  1. 添加定时规则(示例:每小时执行一次):
0 * * * * /opt/scripts/clean_idle_screens.sh

注意事项

  • 先手动测试脚本:执行后检查目标用户的会话状态和日志,确认不会误杀活跃会话。
  • 特殊场景兼容:若会话内有后台运行的nohup、&进程,pstree会识别到子进程,不会被清理。
  • 权限验证:确保root用户能正常切换到目标用户执行screen命令,目标用户的Screen配置无特殊限制。

内容的提问来源于stack exchange,提问作者Luca Moscato

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 09:45:33