我们使用的是centos。一旦服务器重新启动并且操作系统完全加载,我们希望某个用户(“foo”)使用 screen 启动三个或四个脚本。
例如,
screen -d -m -S script1 forever -o script1.log -e script1.log -l script1.log -c php /path/to/script1.php
使用 CentOS 实现这一目标的最佳方法是什么?我宁愿避免过多地研究 init.d 。
使用 systemd,我尝试检查服务(“通知”)并看到以下内容:
Loaded: loaded (/etc/systemd/system/[email protected]; enabled)
Active: failed (Result: exit-code) since Sun 2016-03-20 15:08:04 EDT; 14s ago
Process: 1690 ExecStop=/usr/bin/screen -S notify -X quit (code=exited, status=1/FAILURE)
Process: 941 ExecStart=/usr/bin/screen -d -m -S notify forever -o notifyout.log -e notifyerr.log -l notifyforever.log -c php /path/to/script/notify.php (code=exited, status=0/SUCCESS)
Main PID: 946 (code=exited, status=0/SUCCESS)
为什么会被阻止?我怎样才能开始调试这个?
答案1
由于这是 CentOS 7,因此您应该使用 systemd 服务来启动该服务。您甚至可以让它在屏幕内运行。来自archlinux 维基:
创建一个文件:/etc/systemd/system/[email protected]
[Unit]
Description=screen
After=network.target
[Service]
Type=simple
User=%i
ExecStart=/usr/bin/screen -DmS autoscreen
ExecStop=/usr/bin/screen -S autoscreen -X quit
[Install]
WantedBy=multi-user.target
然后启用它 如果您不打算使其可以在任何用户下运行,您可以在启用它时删除文件名中的@和单元名称中的@USERNAME,并硬编码单元文件中的用户。systemctl enable [email protected]
答案2
我编辑/etc/rc.local
并添加了这个
/etc/init.d/start_bg_scripts
然后我补充道/etc/init.d/start_bg_scripts
:
#!/bin/bash
/usr/bin/screen -d -m -S script1 forever --minUptime 1 --spinSleepTime 1 -o script1out.log -e script1err.log -l script1forever.log -c php /path/to/script.php
--minUptime 1 和 --spinSleepTime 1 意味着它们不断尝试重新连接,直到其余的系统服务(例如 mysqld)变得可用