sh 脚本给 screen 传递命令【非交互模式】
2024年10月19日 10:56
之所以要在 sh 中给 screen 传递命令是因为阿里云的 99 的服务器实在是太拉跨了,并且经常会出现各种诡异的 cpu 跑满的情况。目前上面部署了几个静态站点还有 umami 的统计。
先介绍下 screen:
screen是linux下的一种视窗多重复用管理程序。在使用telnet或SSH远程登录linux时,如果连接非正常中断,重新连接时,系统将开一个新的session,无法恢复原来的session.screen命令可以解决这个问题。
umami、moe-conter 都是通过 screen 启动的,这就导致如果服务器重启了就得重新启动 screen,然后在 screen 中运行命令来启动服务。
阿里云的服务器经常莫名其妙 cpu 就 100 了,当然也可能是收到了攻击,但是具体情况感觉还是太频繁了,此时最简单的办法就是直接强制重启。
如果直接把要执行的命令加到 screen 命令之后写入到 sh 脚本,命令无法正常运行。合格的写法应该是下面的样子(一种形式,还有其他形式):
screen -S moe -dmS screen -x -S moe -p 0 -X stuff "cd /root/Moe-Counter " screen -x -S moe -p 0 -X stuff "sh start.sh "
注意screen -x -S moe -p 0 -X stuff “cd /root/Moe-Counter 一行指令是回车换行编写的,相当于把回车代入到了 cd 命令后面,这样写的好处是省去了插入回车,也可以用下面的写法:
screen -xS screenName -p0 -X stuff $'\n'
$’\n’ 代表回车,我觉得直接换行是最简单的。
有了启动脚本,剩下的就是编辑服务,添加自启动功能:
vim /etc/systemd/system/myautostart.service
创建自定义服务,添加代码:
[Unit] Description=My autostart Service After=network.target [Service] User=firefly ExecStart=/root/sh/start_all.sh Restart=always RestartSec=1 [Install] WantedBy=multi-user.target
重新加载服务:
systemctl daemon-reload
此时在重启,服务就可以自动启动了,省去了人工启动的麻烦。