screen 是 linux 下的后台会话管理工具,许多以前需要后台运行的进程,配合 screen 可以放在前台运行。对比后台进程,好处是随时可以切到 screen 会话中观察进程运行状态。
screen 中的任务既保留了前台任务的优点,又可以随时切到后台运行,并且没有断网的担忧。直接通过 ssh 远程执行的前台任务,如果出现断网会导致进程中断。
缺点是 screen 会话启动多了后,会出现管理困难,比如重启所有 screen 会话。
将 screen 任务制作成 screen 脚本,这样就可以保留 screen 会话内容,在必要时调用脚本启动 screen 任务。
可以把任务简化为两步:
-
创建 x.sh 脚本,脚本内容为实际需要执行的内容;
-
创建启动脚本 x_rc.sh ,该脚本通过 screen 命令调用 x.sh 脚本,并在 screen 会话中执行 x.sh 脚本;
示例:(x.sh)
cd /root/apps
PWD=`pwd`
echo "Current working dir: "$PWD
./speedtest
以上示例脚本启动 speedtest 测速程序,使用前台方式运行。
示例:(x_rc.sh)
RC_NAME=speedtest_001
RC_DIR="/screenjob"
cmd="/bin/bash ${RC_DIR}/rc_job/${RC_NAME}.sh"
SCREEN=/usr/bin/screen
$SCREEN -dmS $RC_NAME
$SCREEN -x -S $RC_NAME -p 0 -X stuff "$cmd"
$SCREEN -x -S $RC_NAME -p 0 -X stuff $'n'
启动脚本 x_rc.sh 负责启动 screen 会话,并在 screen 会话中调用 x.sh 脚本。
批量结束 screen 会话,可以执行如下脚本:(stop_all_screen.sh)
function stop_all_screen
{
for item in `screen -ls| grep Detached| awk '{print $1}'`; do
screen -X -S $item quit
done
}
stop_all_screen
批量创建 screen 脚本,可以提前准备好 x 和 x_rc 脚本,根据 screen 会话名批量调用脚本:
RC_DIR=./
function restart_screen
{
RC_NAME=$1
screen -X -S $RC_NAME quit
/bin/bash $RC_DIR/rc_job/${RC_NAME}_rc.sh
}
restart_screen s001
以上脚本在 github 项目 screenrc 中都准备好了。git clone 下来后,根据自己的需要进行调整:
https://github.com/hyang0/screenrc
screenrc 项目主页:
备注
通过将交互式 screen 任务改造成 screenrc 脚本,可以实现定时或手动重启 screen 任务,达到类似系统服务的效果。
全文完。
原文始发于微信公众号(生有可恋):批量创建 screen 启动脚本
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论