Извините, если этот вопрос уже задавался, но я не уверен, как задать вопрос поисковому запросу для этого. Я очень новичок в Linux и учусь по мере решения проблем.
Я пытаюсь настроить рабочие задания cron для перезапуска запущенного мной игрового сервера.
В настоящее время мой crontab выглядит так
#backup world as instructed by https://github.com/g1franc/SEDS-Setup
0 0 * * * /home/root/spaceengineers/start.sh backupworld
#close server
1 0 * * * /usr/bin/screen -S spaceengineers -X stuff "^C"
#close screen
2 0 * * * /usr/bin/screen -S spaceengineers -X stuff "^M"
#recreate server
3 0 * * * /home/root/spaceengineers/start.sh
Теперь в мире резервного копирования я получаю файл syslog, расположенный по адресу /var/log
i get
May 24 00:00:01 SpaceEngineers CRON[1958]: (root) CMD (/home/root/spaceengineers/start.sh backupworld)
May 24 00:00:01 SpaceEngineers CRON[1957]: (CRON) info (No MTA installed, discarding output)
и то же самое с сервером recreate
May 24 00:03:01 SpaceEngineers CRON[2269]: (root) CMD (/home/root/spaceengineers/start.sh /usr/bin/screen -x spaceengineers)
May 24 00:03:01 SpaceEngineers CRON[2268]: (CRON) info (No MTA installed, discarding output)
Остальные команды работают отлично.
Теперь, прежде чем кто-либо спросит, почему я структурировал свой код именно так, это потому, что в руководстве, которому я следовал, говорится, что сервер нужно запускать через, ~/spaceengineers/start.sh -x spaceengineers
и из того, что я прочитал, мне нужно сделать /usr/bin/screen, чтобы получить доступ к любым командам screen в Cron.
Что я делаю не так и что мне нужно сделать, чтобы исправить свои проблемы?
ОТРЕДАКТИРОВАНО:Изменил crontab в соответствии с текущим содержимым на моем сервере, проблемы остались прежними.
Pastebin из start.sh
решение1
Можете ли вы проверить синтаксис GNU screen для этой строки:
3 0 * * * /home/root/spaceengineers/start.sh /usr/bin/screen -x spaceengineers
Я бы ожидал чего-то вроде:
3 0 * * * /usr/bin/screen -S spaceengineers -X stuff 'command with newline'
Однако использование этого -X
средства screen
предполагает выполнение экранных команд, а не скрипта.
Поэтому вам нужно использовать screen
stuff
команду, как указано здесьвопрос СУ
screen -S sessionname -X stuff 'command'`echo -ne '\015'`
Обновлять
Попробуйте /bin/bash
или там, где находится Shell, который вы используете.
3 0 * * * /bin/bash /home/root/spaceengineers/start.sh
Возможно, добавьте содержимое start.sh
для облегчения отладки.
Вы можете найти shell с помощью which
команды. Возможно, sudo
вам придется быть root, чтобы узнать.
решение2
Эта команда сработала для меня, хотя, поскольку одна или несколько команд в моем скрипте требовали sudo, мне пришлось настроить ее в cron пользователя root:
17 2 29 1 * /usr/bin/screen -dmS $MYSESSIONNAME /bin/bash $FULLPATHTOMYSHELLSCRIPT $SHELLSCRIPTARG1 $SHELLSCRIPTARG2 ...
Ключом к тому, чтобы экран работал (а не просто немедленно закрывался при вызове cron), является аргумент -d
, но, m
вероятно, в некоторых случаях он тоже помогает.
Ниже приведен соответствующий фрагмент из screen --help
вывода.
-dmS name
Запустить как демон: сеанс экрана в отсоединенном режиме.
решение3
@daily /usr/bin/screen -dms aquaticscenery /ig.py && python ig.py