在重新启动时运行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文件并添加了上面的命令。

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

正如文档所示,如果cron.deny文件存在但所有用户都能运行cron作业,那么我尝试在/etc/cron.deny/usr/lib/cron/cron.deny创建空的cron.deny文件/usr/lib/cron/cron.deny 。 但运行cron工作仍然没有运气。

我在做什么?

要从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 
  • 这种情况适用于所有其他情况,但它在@reboot Cron作业中失败,我无法弄清楚原因。 因此,在下面的脚本中使用另一种方法来检查用户是否登录了Mate。

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

我创建了一个名为cron-gui-launcher的小项目。 它可以工作,但它没有测试所有用户的情况(如当前)。 在这里,我已经提取了引用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 
  • 更好的脚本版本: 如何显示由crontab触发的notify-send消息?

2.现在在crontab使用:

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

3.备注:

  • 此脚本不适用于root的crontab 。 因为变量$UID$USER 。 您可以使用特定用户的UID和NAME替换它们。

  • 对于其他DE更改mate-session来自此部分$(pgrep mate-session -n -U $UID)与其他DE的进程名称,例如gnome-session

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

这里介绍了脚本的工作原理:

在此处输入图像描述