В настоящее время пытаюсь настроить cron job
со скриптом python
, который я клонировал из здесь . Иерархия для достижения моего сценария может быть описана следующим образом:
/home
|
|
/Daily-Reddit-Wallpaper
|
|
change_wallpaper_reddit.py
Теперь это работает, когда я использую команду python change_wallpaper_reddit.py --time new
внутри папки Daily_Reddit_Wallpapers
. Однако, когда я пытаюсь выполнить команду * * * * * python ./change_wallpaper_reddit.py --time new
, я получаю сообщение об ошибке:
change_wallpaper_reddit.py: command not found
Когда я пытаюсь вызвать * * * * * python ~/Daily-Reddit-Wallpaper/change_wallpaper_reddit.py
, я получаю:
usage: anaconda [-h] [--show-traceback] [--hide-traceback] [-v] [-q] [--color]
[--no-color] [-V] [-t TOKEN] [-s SITE]
...
anaconda: error: argument : invalid choice: 'Daily-Reddit-Wallpaper' (choose from 'auth', u'label', u'channel', 'config', u'copy', u'download', 'groups', u'login', 'logout', u'notebook', 'package', 'remove', 'search', 'show', u'upload', u'whoami')
Я не понять, почему это происходит.
Проблема состоит в том, что, сценарий не разработан для работы с Кроном. Это использует немного переменных среды, которые не доступны от Крона, и они отличаются, в зависимости от настольной среды текущего пользователя. Это - причина на ее странице, которая будет описана иначе для работы запуска. Но это возможно к установленным значениям этих переменных, в то время как CronJob работает.
Например, когда это - настольная среда Ubuntu по умолчанию, слова ключа поиска должны стать: 'gsettings' и 'крон', затем наш поиск приведет нас к проводным темам как: Фон, не изменяющий использование gsettings от крона, где мы могли найти дополнительные объяснения как:
Если Вы запустите скрипт от своей собственной среды (например, из окна терминала или из Приложений Запуска), то много переменных среды будут установлены.
cron
однако запускает Ваш скрипт с ограниченным набором переменных среды.Отредактировать
gsettings
успешно отcron
, необходимо установитьDBUS_SESSION_BUS_ADDRESS
переменная среды. Можно сделать это путем добавления двух строк к сценарию, как описано здесь...
Здесь мы создадим сценарий запуска, который должен установить необходимые переменные среды в зависимости от выбранного (аргументом) настольная среда.
1. Сначала клонированные Ежедневные Обои Reddit и также устанавливают зависимости:
cd ~
git clone https://github.com/ssimunic/Daily-Reddit-Wallpaper.git
cd ~/Daily-Reddit-Wallpaper
sudo apt-get install python-pip
pip install -r requirements.txt
2. Создайте файл сценария - change_wallpaper_reddit.sh:
cd ~/Daily-Reddit-Wallpaper
touch change_wallpaper_reddit.sh
chmod +x change_wallpaper_reddit.sh
nano change_wallpaper_reddit.sh
Содержание сценария:
#!/bin/sh
# Reference: https://askubuntu.com/a/911958/566421
# Set the script home directory:
SHOME=Daily-Reddit-Wallpaper
# Set the output folder in the home directory to save the Wallpapers to:
DIR=Pictures/Wallpapers
# Set the --time parameter value
TIME=now
# Check if the Desktop Environment is changed:
LAST=$(cat "$HOME/$SHOME/last-desktop-environment.log")
if [ "$1" != "$LAST" ]
then
# Get the name of the last saved wallpaper image:
IMG=$(ls -Art $HOME/$DIR | tail -n 1)
rm $HOME/$DIR/$IMG
fi
# Desktop Environment cases:
if [ -z ${1+x} ] || [ "$1" = "gnome" ] || [ "$1" = "unity" ]
then
# Set the necessary environment variables - PID=$(pgrep gnome-session -u $USER) - UBUNTU/UNITY/GNOME:
export GNOME_DESKTOP_SESSION_ID=true
export DBUS_SESSION_BUS_ADDRESS=$(grep -z DBUS_SESSION_BUS_ADDRESS /proc/$(pgrep gnome-session -n)/environ | cut -d= -f2-)
# Run the script:
$HOME/$SHOME/change_wallpaper_reddit.py --time $TIME --output $DIR
elif [ "$1" = "kde" ]
then
# Set the necessary environment variables - KUBUNTU/PLASMA/KDE:
export KDE_FULL_SESSION=true
export DBUS_SESSION_BUS_ADDRESS=$(grep -z DBUS_SESSION_BUS_ADDRESS /proc/$(pgrep startkde -n)/environ | cut -d= -f2-)
# Run the script:
$HOME/$SHOME/change_wallpaper_reddit.py --time $TIME --output $DIR
elif [ "$1" = "mate" ]
then
# Set the necessary environment variables - Ubuntu MATE/MATE:
export DESKTOP_SESSION=mate
export DBUS_SESSION_BUS_ADDRESS=$(grep -z DBUS_SESSION_BUS_ADDRESS /proc/$(pgrep mate-session -n)/environ | cut -d= -f2-)
# Run the script:
$HOME/$SHOME/change_wallpaper_reddit.py --time $TIME --output $DIR
elif [ "$1" = "lxde" ]
then
# Set the necessary environment variables - type 'echo $DISPLAY` to find your current display - LUBUNTU/LXDE:
export DESKTOP_SESSION=Lubuntu
export DBUS_SESSION_BUS_ADDRESS=$(grep -z DBUS_SESSION_BUS_ADDRESS /proc/$(pgrep lxsession -n)/environ | cut -d= -f2-)
export DISPLAY=$(w $(id -un) | awk 'NF > 7 && $2 ~ /tty[0-9]+/ {print $3; exit}')
# Run the script:
$HOME/$SHOME/change_wallpaper_reddit.py --time $TIME --output $DIR
elif [ "$1" = "xfce4" ]
then
# Set the necessary environment variables - XUBUNTU/XFCE4:
export DBUS_SESSION_BUS_ADDRESS=$(grep -z DBUS_SESSION_BUS_ADDRESS /proc/$(pgrep xfce4-session -n)/environ|cut -d= -f2-)
# Run the script:
$HOME/$SHOME/change_wallpaper_reddit.py --time $TIME --output $DIR
# Get the name of the last saved wallpaper image:
IMG=$(ls -Art $HOME/$DIR | tail -n 1)
# Since 'change_wallpaper_reddit.py' doesn't work properly with xfce4 we shall set the background manually:
xfconf-query --channel xfce4-desktop --property /backdrop/screen0/monitor0/workspace0/last-image --set $HOME/$DIR/$IMG
# Property list: xfconf-query --channel xfce4-desktop --list
# Current settings: xfconf-query -c xfce4-desktop -p /backdrop -lv
# Set 'zoomed' style: xfconf-query --channel xfce4-desktop --property /backdrop/screen0/monitor0/workspace0/image-style --set 5
# References: https://askubuntu.com/q/380550/566421 and https://askubuntu.com/q/414422/566421
else
echo "Wrong argument. It must be:"
echo " - empty (default) = gnome = unity"
echo " - kde"
echo " - lxde"
echo " - mate"
echo " - xfce4"
fi
# Save current value of the Desktop Environment variable:
echo "$1" > "$HOME/$SHOME/last-desktop-environment.log"
Этот сценарий имеет один аргумент $1
, это определяет его поведение в зависимости от выбранного (от Вас) настольная среда (DE). Возможные значения:
gnome
или unity
или empty
(значение по умолчанию) - когда Вы используете Ubuntu по умолчанию DE;kde
- когда Вы используете KUbuntu DE;lxde
- когда Вы используете LUbuntu DE;mate
- когда Вы используете ПОМОЩНИКА Ubuntu DE;xfce4
- когда Вы используете XUbuntu DE.Также можно настроить эти начальные параметры:
SHOME=
установите папку, где Ежедневные Обои Reddit расположены в Вашу систему.DIR=
установите выходную папку в корневом каталоге для сохранения Обоев к - значение по умолчанию (Pictures/Wallpapers
) используется в вышеупомянутом сценарии.TIME=
установите значение --time
параметр change_wallpaper_reddit.py
.3. Создайте CronJob (crontab -e
), это выполняется change_wallpaper_reddit.sh
(в каждый час, например):
При использовании Ubuntu по умолчанию DE этот CronJob мог бы быть:
0 * * * * /home/<your user name>/Daily-Reddit-Wallpaper/change_wallpaper_reddit.sh > /home/<your user name>/Daily-Reddit-Wallpaper/cron.log 2>&1
также этот синтаксис принесет тот же результат:
0 * * * * /home/<your user name>/Daily-Reddit-Wallpaper/change_wallpaper_reddit.sh gnome > /home/<your user name>/Daily-Reddit-Wallpaper/cron.log 2>&1
При использовании KUbuntu DE, например, этот CronJob мог бы быть:
0 * * * * /home/<your user name>/Daily-Reddit-Wallpaper/change_wallpaper_reddit.sh kde > /home/<your user name>/Daily-Reddit-Wallpaper/cron.log 2>&1
Для поиска и устранения неисправностей проверки файл журнала: cat /home/$USER/Daily-Reddit-Wallpaper/cron.log
Voilà. Это работает!
Ссылки и дальнейший перезвон:
Будьте знающие, cronjab выполняется в оболочке, которая имеет ограниченную установку среды. Этим я подразумеваю, что, когда Вы открываете терминал и вводите ENV, Вы будете видеть много переменных среды; один из самых важных является ПУТЕМ. Задание крона не входит в систему если можно так выразиться, таким образом .profile файлы не выполняются. Таким образом в Вашем сценарии необходимо удостовериться, что установили или дополнили переменные среды как ПУТЬ.
Кроме того, запись крона не должна использовать ~, но помещать полный путь.
В моей системе я создал маленький сценарий для списка переменных среды, которые установлены, когда сценарий запускается в кроне. Поскольку Вы видите намного меньше чем тогда, когда в терминале:
HOME=/home/willem
LANG=en_US.UTF-8
LC_ADDRESS=nl_NL.UTF-8
LC_IDENTIFICATION=nl_NL.UTF-8
LC_MEASUREMENT=nl_NL.UTF-8
LC_MONETARY=nl_NL.UTF-8
LC_NAME=nl_NL.UTF-8
LC_NUMERIC=nl_NL.UTF-8
LC_PAPER=nl_NL.UTF-8
LC_TELEPHONE=nl_NL.UTF-8
LC_TIME=nl_NL.UTF-8
LOGNAME=willem
PATH=/usr/bin:/bin
PWD=/home/willem
SHELL=/bin/sh
SHLVL=1
_=/usr/bin/env
Надлежащие сценарии запускают с выражения хижины, некоторый текст, объясняющий, что сценарий сделает (Вы могли бы забыть после нескольких месяцев), и затем установка переменных среды. Небольшой пример (NB willem является моим именем пользователя:
#!/bin/bash # Script is created and tested for Bash.
# Example script Hello, runs outside a terminal so PATH is minimal.
# We must set env vars.
# Note I do not use "export PATH=$PATH:..." etc, because I want my progs
# directory to be found first.
export MYHOME=/home/willem
export MYLOGS=$MYHOME/logs
export MYPROGS=$MYHOME/prog
export PATH=$MYPROGS:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin
#
# The main code of the script:
#
echo "Hello: started" > $MYLOGS/Hello.log
goodDay >> $MYLOGS/Hello.log # goodDay is also in $MYPROGS
...
...
#EOF
Для помещения сценария в крон войти crontab -e
:
Вы находитесь в vi, так перейдите к концу файла и добавьте:
* * * * */home/willem/prog/Hello
Закройте и сохраните и просмотрите свою crontab запись/записи: crontab-l