在Ubuntu系统中开机自启动运行Python脚本

79

我有一个需要在启动时运行的简短Python脚本 - Ubuntu 13.10。我已经尝试了我所能想到的一切,但无法让它运行。脚本如下:

#!/usr/bin/python
import time
with open("/home/username/Desktop/startup.txt", 'a') as f:
    f.write(str(time.time()) + " It worked!")

(实际脚本略有不同,我只是用它进行测试,但您可以明白我的意思。)

我已经尝试了以下所有方法,但都没有成功:

  • 将命令 python startuptest.py 放入crontab,作为普通用户和sudo用户均使用如下命令:@reboot python /home/username/Documents/startuptest.py

  • 将命令 python /home/username/Documents/startuptest.py 放入/etc/rc.local

  • 打开Ubuntu的启动应用程序并放置该命令

  • 完成前面的所有工作,将命令放入一个shell脚本中,并调用该shell脚本。

没有任何作用。 我觉得我可能遗漏了一些简单的东西。 有什么想法吗? (如果我只是从终端运行该命令,脚本就会正常运行。)


在/etc/rc.local中,你尝试过在那里给出完整的Python路径吗?并在rc.local中添加一个简单的'/usr/bin/date >> /tmp/date.stamp'以检查脚本是否运行。 - TeTeT
1
你能验证rc.local是否具有+x权限吗?如果在启动后尝试运行包含Python脚本的/etc/rc.local会发生什么? - Matt
1
使用 crontab 时,您的环境设置可能无法找到 python。请尝试使用完整路径 /usr/bin/python 或类似方法来限定 python - Robert Ekendahl
rc.local具有+x权限;如果我在启动后运行它,脚本就会运行。但是在启动时仍然没有成功。 - crypto
1
Robert - 在crontab中使用/usr/bin/python似乎有效。谢谢! - crypto
尝试这个 https://stackoverflow.com/questions/36831433/django-server-autorun-when-ubuntu-startup-or-reboot - nomi
6个回答

56

使用说明

  • 将Python文件复制到/bin目录下:

    sudo cp -i /path/to/your_script.py /bin

  • 添加新的Cron作业:

    sudo crontab -e

    滚动到底部并添加以下行(在所有#之后):

    @reboot python /bin/your_script.py &

    该行末尾的“&”表示该命令在后台运行,不会阻止系统启动。

  • 测试:

    sudo reboot

实际示例:

  • 将此文件添加到您的桌面:test_code.py(运行它以检查是否适用于您)

from os.path import expanduser
import datetime

file = open(expanduser("~") + '/Desktop/HERE.txt', 'w')
file.write("It worked!\n" + str(datetime.datetime.now()))
file.close()
  • 运行以下命令:

    sudo cp -i ~/Desktop/test_code.py /bin

    sudo crontab -e

  • 添加以下行并保存:

    @reboot python /bin/test_code.py &

  • 现在重新启动计算机,您应该会在桌面上找到一个新文件:HERE.txt


  • Python脚本只能在/bin目录下运行吗? - Johan Dettmar
    它需要处于一个目录中,在该目录下,脚本在系统启动时以 root 权限运行。因此,例如在 /boot/etc 中... 也应该可以工作。 - João Cartucho
    我认为https://dev59.com/GmAf5IYBdhLWcg3wizWu#25805612更简单,更优雅。使用crontab感觉太2000年了。 - Max N
    1
    @MaxN 是的,你说得对。无论如何,crontab有一些非常好的功能,例如,您可以使脚本在特定时间运行。 - João Cartucho
    当使用 crontab -e 命令时,文件会保存在 /tmp 文件夹中。这个正常吗?这样的文件不应该保存在像 /usr/home/etc/opt 这样更可靠的文件夹中吗?为什么要存储在 /tmp 中?这不是我正在创建的一些临时文件。它不能保存在其他文件夹中吗? - Nav
    @Nav 文件保存在 /var/spool/cron/crontabs。crontab 文件不应直接编辑,而是通过使用 -e 选项的 crontab 命令进行编辑。此外,如果您不使用 sudo 编辑 crontab 文件,则将为当前用户而非 root 用户编辑该文件。这意味着添加到 crontab 文件中的任何命令都只会作为该用户执行,而不是作为 root 用户执行。 - João Cartucho

    37
    将此文本放入/etc/init中(在Ubuntu 15.x中使用/etc/systemd)。 mystartupscript.conf
    start on runlevel [2345]
    stop on runlevel [!2345]
    
    exec /path/to/script.py
    

    将这个配置文件放在那里,你就可以钩入Ubuntu的upstart服务,该服务会在启动时运行服务。

    手动启动/停止使用以下命令: sudo service mystartupscript startsudo service mystartupscript stop


    9
    mystartupscript.conf: 无法识别的服务。 - ProGirlXOXO
    1
    @ProGirlXOXO Ubuntu 15.x从/etc/init切换到了/etc/systemd。 - kame
    这个解决方案对我不起作用,但使用crontab的那个确实有效!我正在使用Ubuntu 14.04。 - lfvv
    2
    我遇到了这个错误:无法启动mystartupscript.service: 找不到Unit notifyIP.service。 - Clock ZHONG
    错误:无法启动mystartupscript.service:找不到单元startup_peter.service。 - PeterN
    显示剩余2条评论

    22

    如果您使用Ubuntu,除了您的Python文件代码外,您不需要编写任何其他代码,以下是步骤:

    • 打开Dash(侧边栏中的第一个图标)。
    • 然后输入启动应用程序并打开该应用程序。
    • 在此处单击右侧的添加按钮
    • 在详细信息中填写内容,并在命令区域浏览您的Python文件,然后单击“确定”。
    • 重新启动系统以测试。完成。享受吧!!

    2
    迄今为止,在Ubuntu上最好的方法 - paddyg
    4
    如果 Python 脚本在虚拟环境中运行,那该怎么办?也就是说,在运行脚本之前你需要激活虚拟环境? - Anoop D
    在Lubuntu中,我必须将python /path/to/script.py &添加到LXSession的“默认应用程序”中。 &将在后台运行脚本。 使用ps ax | grep python检查是否在运行。 - bomben
    尽管如此,如果需要sudo权限,则可能无法正常工作。 - mmmmmm

    13

    创建文件 ~/.config/autostart/MyScript.desktop 使用以下内容:

    [Desktop Entry]
    Encoding=UTF-8
    Name=MyScript
    Comment=MyScript
    Icon=gnome-info
    Exec=python /home/your_path/script.py
    Terminal=false
    Type=Application
    Categories=
    
    X-GNOME-Autostart-enabled=true
    X-GNOME-Autostart-Delay=0
    

    这对我有帮助!


    我在Ubuntu上尝试过,它完美地运行了,但是我在橙色Pi上尝试时它不起作用。没有~/.config/autostart/目录。我首先创建了该目录并按照上述方法操作,但它没有起作用。有什么解决办法吗? - Imran
    1
    我的Ubuntu系统中不存在.config中的“autostart”目录。Ubuntu 18.04.5 LTS(Bionic Beaver)。 - cheesus
    @cheesus 我想知道是否 apt install gnome-tweaks 会为您创建它?我也在18.04上,我有一个包含一些 *.desktop 文件的文件夹,我知道我是通过 Tweaks GUI 添加它们作为启动应用程序的。 - Addison Klinke
    与Aditya Argawal上面的答案类似的最终结果,只是通过CLI而不是GUI实现。 - Addison Klinke

    2

    打开终端并输入命令:nano /etc/rc.local

    然后编辑:

    python ~/path-to-script.py

    这对我有用。


    1
    在类似的情况下,我通过将以下内容放入 /etc/rc.local 中取得了良好的效果:
    cd /path/to/my/script
    ./my_script.py &
    cd -
    echo `date +%Y-%b-%d_%H:%M:%S` > /tmp/ran_rc_local  # check that rc.local ran
    

    这在多个Fedora版本和Ubuntu 14.04 LTS上都能工作,适用于Python和Perl脚本。

    我已经尝试了jazcap53发布的方法,以及RickyA在这里发布的版本和我修改了/etc/rc.local文件的另一个版本。我的Python脚本可以创建HERE.txt文件,但在这些情况下没有任何一种情况会在重新启动时生成该文件。 - SteveC

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接