在重新启动时运行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
( 源 )。
这里介绍了脚本的工作原理: