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