我是 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
- 脚本的更好版本:如何显示由 crontab 触发的通知发送消息?
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.下面介绍了脚本的工作原理: