Ubuntu 服务器 cron 任务不起作用

Ubuntu 服务器 cron 任务不起作用

我的脚本应该只在服务器开启时运行,但当通过 cron 运行时,它无法正常工作。如果我手动运行它,它就可以正常工作。

backup() {
  if pidof java &> /dev/null; then

     screen -p 0 -S minecraft -X eval "stuff \"say server backing up\"\015"
     # We need to first put the server in readonly mode to reduce the chance of backing up half of a chunk.
     screen -p 0 -S minecraft -X eval "stuff \"save-off\"\015"
     screen -p 0 -S minecraft -X eval "stuff \"save-all\"\015"

     sleep 10


     cd ~/Minecraft
     mkdir backup
     tar cvfpz backup/Y-$(date +%Y_M-%m_D-%d_T-%H_%M)-world.backup.tar.gz world/

     screen -p 0 -S minecraft -X eval "stuff \"save-on\"\015"
     screen -p 0 -S minecraft -X eval "stuff \"say server done backing up\"\015"

     # Delete old backups
     echo deleting old backups
     find . -name '*-world.backup*' -mtime +5 -delete

   else
      echo Minecraft Server not on
   fi
 }

我想知道是否有人知道为什么服务器停止后它不会停止备份?

答案1

启动该脚本的 crontab 文件是什么样子的?该脚本的权限/所有者是什么?

此链接我发现:

  1. 当 cron 作业从用户 crontab 运行时,它将以该用户的身份执行。但是,它不会获取用户主目录中的任何文件,如其 .cshrc 或 .bashrc 或任何其他文件。如果您需要 cron 获取(读取)脚本所需的任何文件,则应从 cron 调用的脚本执行此操作。设置路径、获取文件、设置环境变量等。
  2. 如果用户帐户有 crontab,但 /etc/passwd 中没有可用的 shell,则 cronjob 将不会运行。您必须为该帐户提供一个 shell,以便 crontab 运行。
  3. 如果您的 cronjobs 没有运行,请检查 cron 守护进程是否正在运行。然后记得检查 /etc/cron.allow 和 /etc/cron.deny 文件。如果它们存在,则您希望能够运行作业的用户必须位于 /etc/cron.allow 中。您可能还想检查 /etc/security/access.conf 文件是否存在。您可能需要在其中添加您的用户。
  4. Crontab 不会解析环境替换。您不能使用 $PATH、$HOME 或 ~/sbin 之类的内容。您可以设置 MAILTO= 或 PATH= 之类的内容以及 /bin/sh shell 使用的其他环境变量。

因此,我首先编辑 cronjob 本身,并将 ~ 更改为 /home/popcorn9499。然后对脚本执行相同操作。同样在脚本中添加#! /bin/bash第一行。

如果脚本中的所有内容都只是函数,backup() {则删除该行和最后的内容},使其成为一个简单的 bash 脚本。然后您可以放弃参数backup,cronjob 变为:(*/30 * * * * /home/popcorn9499/Scripts/minecraft.sh 您真的需要每 30 分钟备份一次吗?)

接下来,确保您对该脚本文件具有 rwx 权限:chmod u+rwx ~/Scripts/minecraft.sh

最后,考虑将您的目录重命名~/Scripts为,~/bin因为它已经在您的 $PATH 中。

这应该可以解决问题。

相关内容