Как узнать, почему мой кронтаб не работает?

Я новичок ... Я просто получу это прямо перед. У меня простой сервер Ubuntu 20.04 LTS, используемый только как сервер minecraft.

Кронтаб дает мне некоторые проблемы

*/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, но я слишком новичок, чтобы разобраться в этом, и я не хочу устанавливать скрипт, который я не могу починить.

Почему в кронтабе не работают эти строки? Я не думаю, что дело в разрешениях. Пожалуйста, помогите мне отладить это

Спасибо за ваше время

EDIT: OK, после копания вокруг, проблема со сценарием startserver была в самом сценарии, а не в кронтабе. Я выяснил, что мне нужен флаг -d для команды screen в crontab.

Команда zip работает, но я не могу понять, какой escape-код использовать для добавления пробелов в дату backup/$(date+"\%Y.\%m.\%d \%I.\%M \%P").zip Использование слеша \ или использование " " не работает. Если кто-нибудь знает, как избежать пробела при создании zip-файлов, пожалуйста, дайте мне знать.

В комментариях мне сказали использовать правильный формат для редактирования поста. Я не знаю, что это значит, это мой первый пост.

1
задан 16 August 2021 в 09:06

1 ответ

Задания, выполняемые через cron или systemd сценарии запуска, не запускаются в той же среде выполнения, что и на рабочем столе. systemd сценарии запуска запускаются от имени root. Ни одно из ваших изменений PATH или других настроек переменных окружения не распространяется автоматически на задание cron. Например, нет $DISPLAY, поэтому программы GUI требуют особого обращения (читайте man xhost).

Можно задать переменные окружения для всех заданий cron в файле crontab. Прочитайте 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), который устанавливает окружение, а затем вызывает нужную программу.

0
ответ дан 20 August 2021 в 10:26

Другие вопросы по тегам:

Похожие вопросы: