阅读视图

发现新文章,点击刷新页面。

sh 脚本给 screen 传递命令【非交互模式】

作者 obaby

之所以要在 sh 中给 screen 传递命令是因为阿里云的 99 的服务器实在是太拉跨了,并且经常会出现各种诡异的 cpu 跑满的情况。目前上面部署了几个静态站点还有 umami 的统计。

先介绍下 screen:

screen是linux下的一种视窗多重复用管理程序。在使用telnetSSH远程登录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

此时在重启,服务就可以自动启动了,省去了人工启动的麻烦。

❌