Скрипт не запускается через crontab, но отлично работает автономно
У меня есть скрипт, который напоминает мне, чтобы перезагрузить компьютер, если uptime
больше, чем, скажем, 3 дня (хотя сейчас он установлен на 0 дней, просто чтобы проверить, работает ли скрипт, так как мой компьютер работал только в течение дня...).
Я понимаю, что это не самый элегантный сценарий, но я пытаюсь! :)
#!/bin/bash
up=$(uptime | grep "day" > /home/username/uptime.foo && awk < /home/username/uptime.foo '{ print $3 }')
[[ $up -gt 0 ]] && xmessage -center "Restart!"
Я сделал его исполняемым chmod + x checkup.sh
и он работает нормально, когда я запускаю его из терминала через ./checkup.sh
Моя запись в crontab для этого скрипта:
46 14 * * * /home/username/Desktop/./checkup.sh
Таким образом, он работает в 14:46 часов ежедневно...
Итак... я думаю, что это должно бежать, если я не сделал что-то действительно глупое. Кроме того, вы думаете, что это нормально, чтобы переместить этот скрипт /bin
?
2 ответа
Одна вещь за один раз:
Сначала давайте дадим вам пользовательскую папку bin:
cd ~/ && mkdir bin
Вы хотите использовать crontab. Давайте начнем с чего-то действительно простого:
* * * * * touch /tmp/testing.txt
Хорошо, так что работает
Теперь давайте попробуем запустить скрипт, который делает то же самое
* * * * * /home/username/bin/touchtest.sh
бегать раз в минуту, пока не получится
Нет, вам не нужно./ в середине строки../ для того, когда вы даете относительные URL.
Хорошо, так что работает
Теперь давайте попробуем запустить скрипт, который вызывает xmessage
* * * * * /home/username/bin/rebootwarn.sh
не работает
Во-первых, мы не должны зависеть от переменных среды. Это включает в себя настройку пути, настройки x11 или что-то еще (переменные окружения python и ruby приходят на ум...)
Давайте сделаем наш файл похожим на правильный файл cron anacron. Я сохранил это как тест
#Borrowed from anacron
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
#End borrowed from anacron
* * * * * /bin/bash /home/username/bin/test.sh
Установите для запуска один раз в минуту
crontab test
импортировать это
К сценарию
#!/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
export DISPLAY=:0.0
up=$(uptime | grep "day" > /home/dnaneet/uptime.foo && awk < /home/dnaneet/uptime.foo '{ print $3 }')
[[ $up -gt 0 ]] && xmessage -center "Restart!"`
Хорошо, это работает... что мы сделали?
Мы изменили все команды, чтобы они не зависели от путей, которые мы не указали явно
Мы явно запустили наш скрипт с помощью bash
Мы сказали сценарию, что ожидаем появления на DISPLAY:0.0
Проблема была решена, прочитайте инструкцию в Google:
описание:
- У меня есть скрипт, использующий
#!/bin/bash
как заголовок - Я ставлю сценарий на
/home/wc3/palert/
анализ:
- crontab не может запустить мой скрипт
- Но если я запускаю вручную, он показывает вывод, а также я могу увидеть результат в моем Интернете
- Это означает, что crontab не может получить среду, отличную от того, когда вы запускаете скрипт в папке скриптов
ответ:
поместите вашу среду, используя эту строку ниже в вашем скрипте с:
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/home/wc3/palert
изменить это:
/home/wc3/palert
with: место, где вы поместили свой скрипт, например/home/budi/script.sh
образец:
#!/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/home/budi
# Script continues...
Попробуйте поставить свой скрипт на crontab.
В моем случае все было из-за того, что это не загруженный профиль в первую очередь. Так что просто используйте
-l
или
--login
. Вот так@reboot bash -l /path/to/scirpt.sh >> /tmp/some.log