Сценарій не працює через 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?


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може не працювати правильно? Тому що воно потребує ./?
DearN

1
Я не думаю, що Cron нічого не знає про вашу X сесію.
glenn jackman

@glennjackman Отже, що це означає? Чи означає це, що запуск такого сценарію через crontab не дозволяє з'являтися спливаючому повідомленню в середовищі gnome?
DearN

Відповіді:


71

Одне за одним:

Спочатку дамо вам папку для сміття на базі користувача:

cd ~/ && mkdir bin

Ви хочете використовувати crontab. Почнемо з чогось справді простого:

* * * * * touch /tmp/testing.txt

Гаразд, так що це працює

Тепер спробуємо запустити сценарій, який робить те саме

* * * * * /home/username/bin/touchtest.sh

бігати раз на хвилину, поки ви не змусите її працювати.
Ні, вам не знадобиться ./ посередині рядка. ./ - це коли ви надаєте відносні URL-адреси.
Гаразд, так що це працює

Тепер спробуємо запустити сценарій, який викликає xmessage

* * * * * /home/username/bin/rebootwarn.sh

не працює

По-перше, нам не потрібно залежати від змінних умов. Сюди входить налаштування шляху, налаштування x11 чи будь-що інше (на згадку приходять змінні середовища python та ruby ​​...)

Давайте зробимо наш схожий на аналогічний файл cron. Я зберег це як тест

#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


Дякую за відповідь. Ви сказали: "Давайте зробимо наш схожий на аналогічний файл cron. Я зберег це як тест". НАШЕ що? Файл crontab? :-/
DearN

Ось те, що я спостерігав. Спершу мені довелося позбутися місця до і після, =щоб вказати рядок DISPLAY. По-друге, коли я відредагував файл crontab і додав PATHзапропонований час та встановив час для запуску пізніше, спливаюче вікно не з’явилося. Однак спливаюче вікно показало чудово під час запуску сценарію, використовуючи /bin/bash... що дає?
DearN

Що ви знаєте, як тільки я змінив свій сценарій export DISPLAY=:0.0, він спрацював чудово. Хоча близько 5 секунд після того, як годинник пролунав годинник, було багато часу, коли моє спливаюче вікно повинно було показати ... Будь-які пропозиції? Але так, ваші поправки до роботи над сценарієм!
DearN

Немає уявлення про відставання на 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
    з: місце, яке ви поставили свій сценарій, наприклад/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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.