通过启动脚本通过 Cron 运行 Daily-Reddit-Wallpaper

通过启动脚本通过 Cron 运行 Daily-Reddit-Wallpaper

目前正在尝试使用我从 git 克隆的脚本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')

我不明白为什么会发生这种情况。

答案1

请注意,cronjab 在具有有限环境设置的 shell 中执行。我的意思是,当您打开终端并输入环境您将看到很多环境变量;其中最重要的一个是 PATH。可以说,cron 作业不会登录,因此不会执行 .profile 文件。因此,您必须在脚本中确保设置或补充环境变量,例如 PATH。
此外,cron 条目不应使用 ~,而应输入完整路径。

在我的系统中,我创建了一个小脚本来列出在 cron 中启动脚本时设置的环境变量。与在终端中相比,您会看到的内容少了很多:

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

正确的脚本以 shebang 表达式开始,一些文本解释脚本将做什么(几个月后你可能会忘记),然后设置环境变量。一个小例子(NB威廉我的用户名是:

#!/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

要将脚本放入 cron,请输入crontab -e
您位于因此转到文件末尾并添加:
* * * * * /home/willem/prog/Hello

关闭并保存,然后查看您的 crontab 条目:crontab -l

答案2

问题是,该脚本不是为与 Cron 配合使用的。它使用了一些环境变量,这些变量无法从 Cron 访问,并且根据当前用户的桌面环境而不同。这就是其页面上以另一种方式描述的原因启动时运行。但可以在 CronJob 运行时设置这些变量的值。

例如,当它是默认的Ubuntu的桌面环境时,搜索关键词应该变成:“gsettings”和“cron”,那么我们的搜索将引导我们找到如下有线主题:使用 cron 中的 gsettings 时背景没有改变,我们可以找到以下额外的解释:

如果您从自己的环境(例如从终端窗口或从启动应用程序)运行脚本,则会设置许多环境变量。cron但是,使用一组有限的环境变量运行脚本。

gsettings要从 成功编辑cron,您需要设置 DBUS_SESSION_BUS_ADDRESS环境变量。您可以通过在脚本中添加两行来实现,如下所述这里...


通过启动脚本通过 Cron 运行 Daily-Reddit-Wallpaper

在这里我们将创建一个启动脚本,它将根据所选择的(通过参数)桌面环境设置必要的环境变量。

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.创建脚本文件 -更改壁纸_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 MATE DE 时;
  • xfce4- 当您使用 XUbuntu DE 时。

您还可以自定义这些初始参数:

  • SHOME=设置文件夹每日 Reddit 壁纸位于您的系统中。
  • DIR=设置主目录中的输出文件夹以保存壁纸 -Pictures/Wallpapers上面的脚本使用了默认值()。
  • TIME=--time设置的参数的值change_wallpaper_reddit.py

3.创造定时任务( 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

瞧。 正在起作用!


参考文献及进一步阅读:

相关内容