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

У меня есть скрипт, который напоминает мне перезагрузить компьютер, если uptime это больше, чем, скажем, 3 дня (хотя сейчас он установлен на 0 дней, просто чтобы проверить, запущен ли скрипт, поскольку мой компьютер работает только более суток ..).

Я понимаю, что это не самый элегантный сценарий, но я стараюсь! :)

#!/bin/bashup=$(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?

По одной вещи за раз:

Сначала давайте дадим вам пользовательскую папку 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 anacronSHELL=/bin/shPATH=/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/bashPATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/binexport DISPLAY=:0.0up=$(uptime | grep "day" > /home/dnaneet/uptime.foo && awk < /home/dnaneet/uptime.foo '{ print $3 }')[[ $up -gt 0 ]] && xmessage -center "Restart!"`

Хорошо, значит, это работает...что мы сделали?
Мы изменили все команды, чтобы они не зависели от путей, которые мы явно не задавали
Мы явно запустили наш скрипт с помощью bash
Мы сообщили сценарию, что ожидаем увидеть на ДИСПЛЕЕ :0.0

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

описание:

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

анализ:

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

ответ:

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

    PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/home/wc3/palert

    изменить это: /home/wc3/palert
    с помощью: место, в которое вы помещаете свой скрипт, например /home/budi/script.sh

образец:

#!/bin/bashPATH=/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

Я бы поместил его в / opt / bin или ~ / bin в качестве общей рекомендации, чтобы не испортить то, что, по мнению пакетов, происходит.

Я не думаю, что cron что-либо знает о вашем сеансе X.

Если вы запустите скрипт следующим образом: /home/dnaneet/Desktop/./checkup.как это работает? Я бы поставил /home/dnaneet/Desktop/checkup.sh

@LnxSlck Да, работает /home/dnaneet/Desktop/./checkup.sh - работает отлично. Но/home/dnaneet/Desktop/checkup.sh может не сработать правильно? Потому что для этого нужен ./`?

@glennjackman Так что же это значит? Означает ли это, что запуск такого скрипта через crontab не позволяет всплывающему сообщению отображаться в среде gnome?

@aking1012 доказал, что я ошибался.

@glennjackman доказал, что вы были правы с точки зрения проверки фактов ДИСПЛЕЙ =:0.0