Скрипт не запускается через crontab, но отлично работает автономно

51

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

Итак ... я думаю, что это должно бежать, если я не сделал что-то действительно глупое. Кроме того, как вы думаете, это нормально, чтобы переместить этот скрипт bash в /bin?

dearN
источник
1
Я бы поместил его в / opt / bin или ~ / bin в качестве общей рекомендации, чтобы не портить то, что думают пакеты.
RobotHumans
Если вы запустите скрипт так: /home/dnaneet/Desktop/./checkup.sh, он работает? Я бы поставил /home/dnaneet/Desktop/checkup.sh
LnxSlck
@LnxSlck Да, /home/dnaneet/Desktop/./checkup.shработает нормально. Но /home/dnaneet/Desktop/checkup.shможет не работать правильно? Потому что это нужно ./?
дорогойN
1
Я не думаю, что cron знает что-нибудь о вашей сессии X.
Гленн Джекман
@glennjackman Так что это значит? Означает ли это, что запуск такого скрипта через crontab не позволяет всплывающему сообщению появляться в среде gnome?
дорогойN

Ответы:

71

Одна вещь за один раз:

Сначала давайте дадим вам пользовательскую папку 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

RobotHumans
источник
Спасибо за ответ. Вы сказали: «Давайте сделаем наш файл похожим на собственный файл cron anacron. Я сохранил это как тест». НАШИ, что? Файл crontab? :-/
дорогойN
Вот что я заметил. Сначала я должен был избавиться от места до и после =для указания строки DISPLAY. Во-вторых, когда я отредактировал свой файл crontab, добавил PATHпредложенное и установил время для запуска позже, всплывающее окно не показывалось. Тем не менее, всплывающее окно показало нормально при запуске сценария с помощью /bin/bash... что дает?
дорогойN
Что вы знаете, когда я изменил свой сценарий export DISPLAY=:0.0, он работал нормально. Несмотря на то, что примерно через 5 секунд после того, как часы показывали час, когда показывалось мое всплывающее окно, должен был наблюдаться значительный сдвиг ... Есть предложения? Но да, ваши поправки к сценарию работают!
дорогойN
Понятия не имею о 5-секундном отставании.
RobotHumans
3
Мне нравится, как вы прошли этот шаг за шагом, а затем подвели итоги - спасибо!
jbobbins
10

Проблема была решена, прочитайте инструкцию в Google:

описание:

  1. У меня есть скрипт, использующий в #!/bin/bashкачестве заголовка
  2. Я ставлю сценарий на /home/wc3/palert/

анализ:

  1. crontab не может запустить мой скрипт
  2. Но если я запускаю вручную, он показывает вывод, а также я могу увидеть результат в моем Интернете
  3. Это означает, что crontab не может получить среду, отличную от того, когда вы запускаете скрипт в папке скриптов

ответ:

  1. поместите вашу среду, используя эту строку ниже в вашем скрипте с:

    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.

буди сатрийо
источник
не работает для меня
Джон Джо
Работа, как шарм для меня!
1rq3fea324wre