@reboot 在 CRON 中不起作用

Posted

技术标签:

【中文标题】@reboot 在 CRON 中不起作用【英文标题】:@reboot is not working in CRON 【发布时间】:2016-11-22 18:35:38 【问题描述】:

我正在尝试在我的 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 "$GREENUP TO DATE$NC\n\n"
        else
                cp $STEAMCMD_API $UNTURNED_API
                printf "$YELLLOWUPDATING$NC\n\n"
        fi
else
        printf "$REDNOT 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 参数,这样服务器就不需要terminal 来记录启动.

我不确定这里可以做多少才能使@reboot 按预期工作。

如何让我的脚本在启动时运行? CRON@reboot还有其他替代品吗?

提前致谢。

【问题讨论】:

我尝试在@reboot 的命令之前添加sleep 60;,也没有成功。我也试过@reboot root /home/steam/check.sh 我认为您应该使用基于 systemd 的服务来解决这个问题。您将获得自动重启、正确存储日志以及在启动时“免费”运行。 感谢您的回复。我刚刚在 Wikipedia 中读到了 systemd,但您介意针对我的问题更详细地解释这一点吗?我只是觉得在这方面太迷失了。 我主要是建议这样做,以了解您正在使用的 ubuntu 版本是否有 systemd。请检查,例如检查您的系统上是否有 systemctl 可执行文件。 【参考方案1】:

检查 crond.service 的关键链,如 This StackExchange post 中所问和回答的那样

另外,请参考 this FreeDesktop article 解决此问题。

通常,systemd 被配置为具有非常有限的依赖关系,并行启动许多守护程序以减少启动时间。如果存在假定网络处于稳定状态的组件,则不一定依赖于网络完全正常运行的服务将失败。诸如此类的故障可能难以诊断,但使用 systemd-analyze critical-chainjournalctl -xel 输出可能会导致您找到问题的根本原因。

【讨论】:

【参考方案2】:

就我而言,我在 /usr/local/bin 中有一个脚本,并尝试执行 @reboot namescript 输入完整路径就足够了 @reboot /usr/local/bin/namescript

【讨论】:

【参考方案3】:

试试man 5 crontab。如果您的 crontab 支持,您应该会看到 @reboot、@yearly、@monthly、.、、、

然后尝试添加一些睡眠时间可能会有所帮助。

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

【讨论】:

这对我有用,感谢您提供这个简单的解决方案【参考方案4】:

查看 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 手册页。

【讨论】:

看起来不错,明天我会尽快检查,如果有效,请检查答案是否有效。谢谢。 它适用于我所有的脚本❤,我使用的是 Ubuntu Server 14.04 如果更多人想知道如何删除服务。 superuser.com/questions/513159/…

以上是关于@reboot 在 CRON 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Linux:gsutil 在 cron 中不起作用

cron 资源在 aws opswork 中不起作用?

Cron 工作在每当 gem 中不起作用

相对路径在 cron PHP 脚本中不起作用

Bash + Expect脚本在cron RHEL 7中不起作用

cron作业中的Rails类方法在弹性beantalk中不起作用