重启时运行 Python 脚本的 Cron 作业不起作用

重启时运行 Python 脚本的 Cron 作业不起作用

我是 Linux 新手,我阅读并遵循了许多在重启时运行 Python 脚本的说明,但都不起作用:

这是我想要运行的命令:

/usr/bin/python3 /home/am/projects/AMAcc/map.py

我使用crontab -e并添加了

@reboot /usr/bin/python3 /home/am/projects/AMAcc/map.py

我尝试sudo crontab -e并添加了相同的命令

我甚至编辑了/etc/crontab文件并添加了上述命令。

尝试#!/usr/bin/python3在我的 Python 代码顶部添加并更改其权限,例如: sudo chmod a+x map.py

cron.deny由于文档建议,如果文件存在但为空,则所有用户都能够运行 cron 作业,因此我尝试在和中创建空cron.deny文件。但仍然无法运行 cron 作业。/etc/cron.deny/usr/lib/cron/cron.deny

我到底做错了什么?

答案1

要从 Cron 执行任何 GUI 应用程序,您应该导出一些桌面环境变量。在大多数情况下,导出当前值就足够了$DISPLAY。我建议您创建一个额外的启动 (bash) 脚本,它将启动您的应用程序。

这个答案提供了可靠的方法来查找和导出当前用户的$DISPLAY值。但有一个问题。当用户未登录到 DE 时,该$DISPLAY值未设置。因此,我们可以添加一个附加条件,就像在这回答了

# Get the value of the $DISPLAY variable for the current user. Unset it just in case this is a `ssh -X` connection
unset DISPLAY;
while [ "$DISPLAY" == "" ]; do
        export DISPLAY=$(w "$USER" | awk 'NF > 7 && $2 ~ /tty[0-9]+/ {print $3; exit}' 2>/dev/null) && sleep 3
done
  • 此条件在所有其他情况下都有效,但在 Cron 作业中失败@reboot,我无法找出原因。因此,在下面的脚本中使用另一种方法来检查用户是否已登录 Mate。

一些应用程序需要更多的变量(例如参见答案)为$DBUS_SESSION_BUS_ADDRESS$DESKTOP_SESSION。我认为最好的方法是查找当前用户的桌面会话进程在目录中/proc(进程信息伪文件系统)并从文件environ内部导出所有变量/proc/process-number

我创建了一个小项目,叫做cron-gui-启动器致力于此。有用但并未针对所有用户的情况进行测试(如当前情况)。这里我提取了参考 Mate DE 的必要部分并进行了上述修改。

1.创建一个包含以下内容的可执行文件:

#!/bin/bash -e

# Check whether the user is logged in Mate
while [ -z "$(pgrep mate-session -n -U $UID)" ]; do
        sleep 3 && count=$((count+1)) && echo "$count" > /tmp/mate-cron.log
done

# Get the content of the Current-Desktop-Session Environment File as an array:
EnvVarList=`cat -e "/proc/$(pgrep mate-session -n -U $UID)/environ" | sed 's/\^@/\n/g'`

# Export the Current-Desktop-Session Environment Variables:
for EnvVar in $EnvVarList; do
        echo "$EnvVar" >> /tmp/mate-cron.log
        export "$EnvVar"
done

# Execute the list of the input commands
nohup "${1}" >/dev/null 2>&1 &

exit 0

2.現在正在crontab使用:

@reboot /path-to-the/script "your-application"

3.笔记:

  • 此脚本不能以 root 身份运行crontab。因为存在变量$UID$USER。您可以用特定用户的 UID 和 NAME 替换它们。

  • 对于其他 DE,请使用其他 DE 的流程名称mate-session从此部分进行更改,例如。$(pgrep mate-session -n -U $UID)gnome-session

  • 或许对于在系统启动时执行的 GUI 应用程序,最好在启动应用程序中创建一个条目. 对于 Mate DE:Control Centre > Personal > Startup Applications(来源)。

4.下面介绍了脚本的工作原理:

在此处输入图片描述

相关内容