我怎样才能找出我的 crontab 不工作的原因?

我怎样才能找出我的 crontab 不工作的原因?

我是新手...我会先把这个说清楚。我有一个简单的 Ubuntu 20.04 LTS 服务器,仅用作 minecraft 服务器。

crontab 给我带来了一些问题

*/10 * * * * screen -S minecraft -p 0 -X stuff "save-all^M"
@reboot /home/minecraft/startserver.sh
@daily find /home/minecraft/backup/* -mtime +6 -type f -delete
@daily zip -9 -r --exclude=*backup* --exclude=*web* --exclude=*crash-reports* --exclude=*lost+found* /home/minecraft/backup/$(date +"%Y.%m.%d %I.%M %P").zip /home/minecraft

第一行有效,但 @daily 和 @reboot 根本不起作用。所有命令都可以从终端运行,没有错误。

请帮我理解这一点,我对 Linux 没什么经验,我正在尝试弄清楚这一点。我知道有些人可能认为使用 systemd 处理会更好,但我还太新,还搞不清楚,而且我不想安装无法修复的脚本。

为什么 crontab 会失败这些行?我不认为这是权限问题。请帮我调试一下

谢谢你的时间

编辑:好的,经过一番研究,我发现 startserver 脚本的问题出在脚本本身而不是 crontab 中。我发现我需要-d在 crontab 中为 screen 命令添加标志。

zip 命令可以工作,但我不知道该使用什么转义代码来在日期中添加空格。backup/$(date +"\%Y.\%m.\%d \%I.\%M \%P").zip使用斜线\或使用" "不起作用。如果有人知道如何在创建 zip 文件时转义空格,请告诉我。

评论里有人告诉我要使用正确的格式来编辑帖子。我不知道那是什么意思,这是我的第一篇帖子。

答案1

通过 运行的作业cronsystemd启动脚本不会在与桌面相同的运行时环境中运行。systemd启动脚本以 运行root。您的任何PATH更改或其他环境变量设置都不会自动传播到您的cron作业。例如,没有$DISPLAY,因此 GUI 程序需要特殊处理(阅读man xhost)。

cron人们可以在crontab文件 Read中为所有作业设置环境变量man 5 crontab

echo "=== id ===";id;echo "=== set ===";set;echo "=== env ===";env | sort;echo "=== alias ===";alias查看每个环境中的结果 。

由于command该行的一部分crontab默认由 解释/bin/sh,其语法比 更简单/bin/bash,因此我建议command调用一个bash脚本(可执行、已安装、以 开头#!/bin/bash)来设置环境,然后调用所需的程序。

相关内容