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

47

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

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

#!/bin/bash

up=$(uptime | grep "day" > /home/dnaneet/uptime.foo && awk < /home/dnaneet/uptime.foo '{ print $3 }')

[[ $up -gt 0 ]] && xmessage -center "Restart!"

Я сделал его исполняемым файлом chmod + x checkup.sh , и он отлично работает, когда я запускаю его из терминала через ./checkup.sh

Моя запись crontab для этого скрипта:

46 14 * * * /home/dnaneet/Desktop/./checkup.sh

Итак, он работает в 14: 46 часов в день ...

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

    
задан drN 01.04.2012 в 20:52
источник

2 ответа

63

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

Сначала дадим вам папку с 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 01.04.2012 в 22:10
источник
8

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

Описание:

  1. У меня есть скрипт, использующий #!/bin/bash as header
  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
    с: местом, в которое вы помещаете свой скрипт, например. /home/budi/script.sh

Пример:

#!/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/home/budi
# Script continues...

Попробуйте поставить скрипт на crontab.

    
ответ дан budi satriyo 04.04.2013 в 17:03