我是新手...我会先把这个说清楚。我有一个简单的 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
通过 运行的作业cron
或systemd
启动脚本不会在与桌面相同的运行时环境中运行。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
)来设置环境,然后调用所需的程序。