我的脚本应该只在服务器开启时运行,但当通过 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 文件是什么样子的?该脚本的权限/所有者是什么?
在此链接我发现:
- 当 cron 作业从用户 crontab 运行时,它将以该用户的身份执行。但是,它不会获取用户主目录中的任何文件,如其 .cshrc 或 .bashrc 或任何其他文件。如果您需要 cron 获取(读取)脚本所需的任何文件,则应从 cron 调用的脚本执行此操作。设置路径、获取文件、设置环境变量等。
- 如果用户帐户有 crontab,但 /etc/passwd 中没有可用的 shell,则 cronjob 将不会运行。您必须为该帐户提供一个 shell,以便 crontab 运行。
- 如果您的 cronjobs 没有运行,请检查 cron 守护进程是否正在运行。然后记得检查 /etc/cron.allow 和 /etc/cron.deny 文件。如果它们存在,则您希望能够运行作业的用户必须位于 /etc/cron.allow 中。您可能还想检查 /etc/security/access.conf 文件是否存在。您可能需要在其中添加您的用户。
- 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 中。
这应该可以解决问题。