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

如何编写启动脚本实现detached screen切换用户及多命令执行

Screen会话批量启动机器人脚本实现方案

失效原因说明

你之前尝试的几种screen内切换用户的写法不生效,核心原因是screen -X的作用是向运行中的screen会话发送原始按键信号,而非直接执行shell命令,直接传入su discordbot无法进入su的交互shell上下文,后续命令自然无法在切换用户后的环境中执行;如果先创建空screen会话再逐次发送命令,还要处理按键时序、等待su执行完成的问题,稳定性极差,不建议采用。

最优实现方案

不要先创建空screen会话再逐步注入操作,直接在创建detached模式screen会话的阶段,就指定以目标用户身份执行完整启动链路,既省去会话内交互切换用户的麻烦,也能封装成通用函数支持批量启动多实例。

可直接复用的脚本代码

#!/bin/bash

# 通用screen会话启动函数
# 入参顺序:screen会话名、运行用户、程序工作目录、启动命令
start_bot() {
    local session_name=$1
    local run_user=$2
    local work_path=$3
    local exec_cmd=$4

    # 检测同名会话是否已存在,避免重复启动
    if screen -list | grep -q "\.${session_name}\s"; then
        echo "跳过启动:screen会话[${session_name}]已存在"
        return 1
    fi

    # 一次性创建detached会话,切换用户后执行目录跳转+程序启动
    screen -d -m -S "${session_name}" su - "${run_user}" -c "cd ${work_path} && ${exec_cmd}"
}

# 以下为多实例启动示例,按需修改参数即可
start_bot "discordbot_main" "discordbot" "/srv/discord/main-bot" "java -Xmx1G -jar main-bot.jar"
start_bot "discordbot_music" "discordbot" "/srv/discord/music-bot" "java -Xmx512M -jar music-bot.jar"
start_bot "discordbot_tool" "discordbot" "/srv/discord/tool-bot" "python3 run.py"

使用说明

  • 脚本中使用su - 用户名 -c "命令序列"是su的标准非交互执行模式,会自动加载目标用户的环境变量,不存在上下文丢失问题,&&拼接的命令会按顺序依次执行:先切换到指定工作目录,再运行对应的启动命令。
  • 给脚本加执行权限直接运行即可:chmod +x start_bots.sh && ./start_bots.sh
  • 需要查看程序运行输出时,执行screen -r 对应会话名即可进入会话,需要退出保持后台运行时按快捷键Ctrl+A后再按D即可detach回到主shell。
  • 要停止对应机器人,直接执行screen -S 会话名 -X quit即可关闭会话和内部运行的程序。

内容的提问来源于stack exchange,提问作者Leo Keil

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 16:06:27