如何编写启动脚本实现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
相关产品推荐
相关产品推荐

