通过 Crontab 运行 shell 脚本

通过 Crontab 运行 shell 脚本

因此我尝试通过 crontab 运行 shell 脚本。

我的 Crontabs 如下所示: 00 20 * * * $HOME/Bilder/Hintergründe/.background_skript/background_night.sh

我的 background_day.sh 如下所示:

`#!/bin/bash wallpaper="$HOME/Bilder/Hintergründe/appa_night.jpg"

gsettings 设置 org.gnome.desktop.background picture-uri-dark file:///"$wallpaper"`

我已经使用以下方式分配了 chmod 权限:chmod +x background_night.sh

如果我直接用 shell 运行它,它也能正常工作。

grep CRON /var/log/syslog 如下所示:

May 25 15:07:01 sebs-thinkpad CRON[90433]: (seb) CMD (sh /home/seb/Bilder/Wallpaper/.background_skript/background_night.sh) May 25 15:08:01 sebs-thinkpad CRON[90472]: (CRON) info (No MTA installed, discarding output)

我不知道我做错了什么。

答案1

用来> cron.log 2>&1让 cronjob 将其输出写入文件,以便您可以看到它生成的错误消息。(当邮件不可用时,某些 cron 守护程序会自动将输出写入系统日志;您的守护程序显然不会这样做。)

最有可能的问题是 'gsettings set' 通过 D-Bus 工作(会议总线(具体来说,不是系统总线)并且通常需要存在DBUS_SESSION_BUS_ADDRESS或环境变量之一(取决于设置)。XDG_RUNTIME_DIR

首先,不过:

  • 如果您的系统有systemctl --user可用资源,请考虑使用其.timer单元,因为您的图形桌面很可能已经将必要的环境变量转发到您的 systemd 每个用户管理器中。

  • 如果您不想处理 .timer 和 .service 单元,您可以使用systemd-runcrontab 在正确的环境中启动脚本:

    00 20 * * * systemd-run --user ~/Bilder/Hintergründe/.background_skript/background_night.sh
    

如果你想通过 cron 完成所有事情:

  1. echo $DBUS_SESSION_BUS_ADDRESS在终端窗口中运行并检查显示的路径。

  2. 如果总线路径显示为/run/user/XXX/bus,则其位置是静态的 - 您可以将以下内容之一放在 cronjob 的顶部(或者,将export它们放在脚本的开头):

    XDG_RUNTIME_DIR="/run/user/XXX"
    DBUS_SESSION_BUS_ADDRESS="unix:path=/run/user/XXX/bus"
    

    (通常 XDG_RUNTIME_DIR 足以覆盖 D-Bus 以及其他各种组件。)

  3. 如果总线路径显示为/tmp/dbus-XXXXXXX,则它是动态的 – 您需要在每次登录时将该值存储在某处:

    1. 编辑~/.xprofile~/.xinitrc(以适用者为准)将环境存储在文件中:

      echo "$DBUS_SESSION_BUS_ADDRESS" > /tmp/dbus.env
      echo "$DISPLAY" > /tmp/display.env
      
    2. 编辑脚本以从文件加载环境:

      export DBUS_SESSION_BUS_ADDRESS=$(< /tmp/dbus.env)
      export DISPLAY=$(< /tmp/display.env)
      

答案2

所有用户的 Cron 任务均由 root 运行。这意味着某些个人快捷方式不合适:

  • $HOME必须用明确路径替换。~/还有。
  • root使用$PATH的不是您自己定制的$PATH。对可执行文件使用完整路径。
  • 您的环境中的变量可能不存在于根环境中。

相关内容