Запуск .sh каждые 5 минут

12

У меня есть скрипт .sh, который загружает фотографию с сервера японского спутника и устанавливает ее в качестве фоновой картинки. Я поместил его в список автозагрузки, но как мне запускать его каждые 5 минут автоматически?

Александр Махнёв
источник
1
Попробуйте cronmaker.com, там вы можете сделать cron-выражения и поместить его с помощью crontab -e
Мы Борг,
2
Меняется ли картина каждые 5 минут? Попробуйте использовать интервал, который создает меньше ненужной нагрузки на целевом сервере. Или убедитесь, что вы загружаете только если файл действительно изменился.
til_b
1
Кстати, а что за ссылки на космические фоны?
Богдан_троценко

Ответы:

14

Ленивый вариант

Если вам нужен простой способ, и вам не нужно выяснять, какую переменную среды установить:

  • Убедитесь, что ваш сценарий включает в себя шебанг
  • Сделайте это исполняемым
  • Добавьте следующее в Startup Applications:

    /bin/bash -c "sleep 15 && while true; do <path_to_your_script.sh> ; sleep 300; done"

    Dash> Автозагрузка приложений> Добавить. Добавьте команду:

    /bin/bash -c "sleep 15 && while true; do <path_to_your_script.sh> ; sleep 300; done"

объяснение

Если вы запускаете сценарий из собственной среды (например, из окна терминала или из автозагрузки), будет установлен ряд переменных среды. cronоднако ваш скрипт запускается с ограниченным набором переменных среды.
Поскольку ваш скрипт без сомнения использует gsettingsкоманду:

gsettings get org.gnome.desktop.background picture-uri <wallpaper>

чтобы установить обои, почти наверняка команда сломается при запуске из cron.

Обратная сторона «ленивого решения» чисто теоретическая. Команда, которая спит практически непрерывно, ничего не значит для вашей системы.

Дополнительная информация; альтернативно

Читая этот пост , и исходя из прошлого опыта, я почти уверен, что DBUS_SESSION_BUS_ADDRESSнеобходимо установить переменную окружения.

Для этого добавьте следующий раздел в начале вашего скрипта (ниже шебанга):

PID=$(pgrep gnome-session)
export DBUS_SESSION_BUS_ADDRESS=$(grep -z DBUS_SESSION_BUS_ADDRESS /proc/$PID/environ|cut -d= -f2-)

Тогда вы сможете успешно запустить его cron.

Вы могли бы, однако, очень хорошо сохранить шум и выбрать ленивый вариант.

Якоб Влейм
источник
@AleksanderMahnyov Добро пожаловать. Рад, что это работает :)
Jacob Vlijm
2
Намного лучше использовать работу cron.
Лука Рамишвили
1
@LukaRamishvili Спасибо за комментарий. Однако: а. И почему так? Спящая команда ничего не значит для вашей системы. б. Я даже включил опцию.
Джейкоб Влейм
1
В противном случае, хорошее исследование переменных сеанса gnome, это очень помогло бы OP, так как это потребовалось бы в любом случае.
Лука Рамишвили
2
Я просто посмотрел: о cpu 0.0%каком налоге идет речь?
Джейкоб Влейм
24

Поместите это в свой crontab.

Откройте ваш cronстол по:

crontab -e

Теперь добавьте:

*/5 * * * * /path/to/script.sh

Не забудьте заранее сделать скрипт исполняемым.


Поскольку ваш сценарий зависит от X, вероятно, будет хорошей идеей добавить DISPLAYего в среду сценария:

*/5 * * * * DISPLAY=:0 /path/to/script.sh

Замените :0на ваш фактический DISPLAY(можно найти echo $DISPLAYиз интерактивного сеанса).

При необходимости вы также можете добавить XAUTHORITYпеременную окружения:

*/5 * * * * DISPLAY=:0 XAUTHORITY="~/.Xauthority" /path/to/script.sh

Опять вы можете найти значение по echo $XAUTHORITY.

heemayl
источник
1
Не уверен, что он работает с ограниченными переменными окружения cron, но давайте посмотрим, упоминает ли OP, что он работает :)
Jacob Vlijm
1
@AleksanderMahnyov Пожалуйста, отредактируйте свой вопрос, чтобы добавить сценарий, трудно сказать, не видя содержания .. возможно DISPLAY(и / или XAUTHORITY) проблема ..
heemayl
1
@ Kartagis Cron не может обрабатывать секунды, также вы пытаетесь делать это часами, что по-прежнему синтаксически неправильно ..
heemayl
2
Мне нравится этот метод, а не "ленивый метод", потому что я знал о cron, но мне нужно было пройти курс повышения квалификации. Это именно то, что я сделал, большое спасибо! :)
ZaxLofful
2
Лучше подход, чем принятый ответ. :)
Сандип Кумар