@reboot在CRON中无法正常工作

17
我将尝试在Ubuntu服务器启动时运行一个shell脚本和一个命令。
这是我的CRON:
@reboot /home/steam/check.sh
@reboot screen -d -S up -m node /var/www/html/Up1/server/server.js

我在日志中看到的内容是: grep CRON /var/log/syslog

Jul 19 19:48:28 vc1s cron[3185]: (CRON) INFO (pidfile fd = 3)
Jul 19 19:48:28 vc1s cron[3185]: (CRON) INFO (Running @reboot jobs)
Jul 19 19:48:28 vc1s CRON[3209]: (root) CMD (screen -d -S up -m node /var/www/html/Up1/server/server.js)
Jul 19 19:48:28 vc1s CRON[3211]: (root) CMD (/home/steam/check.sh)
Jul 19 19:51:20 vc1s cron[3779]: (CRON) DEATH (can't lock /var/run/crond.pid, otherpid may be 3185: Resource temporarily unavailable)
Jul 19 19:55:01 vc1s CRON[3996]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)

我的check.sh脚本。

#!/bin/bash

until screen -d -S unturned -m /home/steam/start.sh; do
        echo "Server 'myserver' crashed with exit code $?.  Respawning.." >&2
        sleep 1
done

这是我的start.sh文件,用于启动Unturned游戏服务器。我认为这个脚本不是很重要,但我想我应该向您展示。

#!/bin/bash
# This script starts a Unturned 3 server on Linux machines
# Syntax: start.sh <instance name>
# Author: fr34kyn01535

#CONFIG
INSTANCE_NAME=1
STEAMCMD_HOME="./steamcmd"
UNTURNED_HOME="./unturned"

#COLORS
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLLOW='\033[0;33m'
NC='\033[0m'

#Steam checks
STEAMCMD_API=$STEAMCMD_HOME/linux32/steamclient.so
UNTURNED_API=$UNTURNED_HOME/Unturned_Data/Plugins/x86/steamclient.so
printf "Steam: "
if [ -f $STEAMCMD_API ]; then
        if diff $STEAMCMD_API $UNTURNED_API >/dev/null ; then
                printf "${GREEN}UP TO DATE${NC}\n\n"
        else
                cp $STEAMCMD_API $UNTURNED_API
                printf "${YELLLOW}UPDATING${NC}\n\n"
        fi
else
        printf "${RED}NOT FOUND${NC}\n\n"
fi

cd $UNTURNED_HOME

if [ -f RocketLauncher.exe ]; then
        ulimit -n 2048
        mono RocketLauncher.exe $INSTANCE_NAME
else
        echo "RocketLauncher not found."
fi

问题在于,如果我从目录/home/steam执行./check.sh,它可以正常工作。但当我重新启动我的VPS时,@reboot就会失效。
如果我重新启动,screen -list 不会显示任何内容。
我尝试了多种方法,但都没有成功,最后一件我改变的事情是在 screen 命令中添加了 -d 参数,这样服务器就不需要一个 终端 来写下启动信息。
我不确定是否有办法让 @reboot 正常工作。 如何让我的脚本在开机时运行?除了CRON@reboot,还有其他替代方法吗? 提前感谢您的帮助。

我尝试在@reboot命令前添加sleep 60;,但仍未奏效。我还尝试了@reboot root /home/steam/check.sh - Jose Serodio
我认为你应该使用基于systemd的服务来解决这个问题。这样可以获得自动重启、适当的日志存储以及免费的开机运行。 - Jonas Schäfer
1
谢谢您的回复。我刚在维基百科上读到了关于systemd的内容,但您介意详细解释一下并聚焦于我的问题吗?我感觉在这个领域里太迷茫了。 - Jose Serodio
我主要是建议这样做是为了找出你正在使用的Ubuntu版本是否有systemd。请检查一下,例如通过检查你的系统上是否有systemctl可执行文件。 - Jonas Schäfer
4个回答

31

请尝试运行 man 5 crontab 命令。如果您的 crontab 工具支持,您应该会看到 @reboot、@yearly、@monthly 等等。

然后,您可以尝试添加一些休眠时间,这可能有所帮助。

@reboot sleep 60;/root/s3-mount.sh

这对我很有帮助,感谢您提供的简单解决方案。 - João Lourenço

8
请查看systemd.service手册,它描述了如何配置systemd来管理服务。我相信您会在/usr/lib/systemd/system或类似路径中找到适用于您系统的示例。
在您的情况下,服务看起来应该是这样的:
[Unit]
Description=Unturned Game Server

[Install]
WantedBy=multi-user.target

[Service]
ExecStart=/bin/bash /home/steam/start.sh
Type=simple
User=steam
Group=steam
WorkingDirectory=/home/steam
Restart=on-failure

将以下内容放入文件/etc/systemd/system/unturned.service中。然后运行systemctl daemon-reload(第一次以及每当更改unturned.service时告诉systemd重新读取配置),然后使用systemctl start unturned.service来启动游戏服务器。
如果按预期工作,可以使用systemctl enable unturned.service确保它在启动时自动运行。
以下是选项的说明:
- 如果start.sh不应作为用户/组steam运行,请进行适当的编辑。 - Install部分中的WantedBy指定了systemd在使用systemctl enable启用服务时会引用哪个“目标”(请参阅man systemd.target)。 - Restart定义了systemd将在哪些情况下自动重启服务。有关其他与重启相关的选项,您可能需要更改,请参阅systemd.service手册。

看起来不错,我会尽快在明天检查它,如果它有效的话,我会将答案标记为有效。谢谢。 - Jose Serodio
它适用于我所有的脚本 ❤,我正在使用Ubuntu Server 14.04。 - Jose Serodio
1
如果有更多的人想知道如何删除一个服务,请参考以下链接:http://superuser.com/questions/513159/how-to-remove-systemd-services#936976 - Jose Serodio

1
检查crond.service的critical-chain,如此StackExchange帖子所述。
同时,请参考这篇FreeDesktop文章解决此问题。
一般来说,systemd被配置为具有非常有限的依赖关系,并行启动许多守护程序以减少启动时间。如果有组件假定网络处于稳定状态,而不是绝对依赖于网络完全运作正常的服务将会失败。这样的故障可能很难诊断,但使用systemd分析关键链journalctl -xel输出可以帮助您找到问题的根本原因。

0
在我的情况下,我有一个脚本在/usr/local/bin目录下,尝试使用@reboot namescript,只需输入完整路径@reboot /usr/local/bin/namescript即可。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接