在启动时运行Python脚本


29

这个问题已经被问过好几次了,但是我似乎并没有利用现有的信息来解决这个问题。

我的Pi运行Raspbian。我有一个名为dnscheck.py的Python脚本,它将永远循环。

我需要它在启动时运行。我知道我必须创建一个包含以下内容的.sh文件

sudo python dnscheck.py &

我不知道该文件应该在哪里或是否应该包含其他文件。我知道init.d文件夹,但是看到框架示例,我想应该有一种更简单的方法来完成此简单任务。


一个真正简单的方法,请查看此分步教程-> youtu.be/Tvnrx-2QaUU根据需要制作尽可能多的启动器,并在crontab中找到所有启动器
Hossein RM

Answers:


20

如果您想使用框架脚本使用诸如启动,停止,重新启动等命令来控制过程,并根据需要对其进行更改可能是最佳选择。

如果只想启动该过程,请将命令放入/etc/rc.local。(我手头没有RPi,但我在线阅读有一个“ exit 0”行,应该将命令放在这行上方)


1
有效!我必须添加将脚本和rc.local的权限设置回755(读/写/执行)的必要条件。不知道两者是否都需要此设置,但对我有用。非常感谢您的帮助!
弗拉德·施纳科夫斯基(Flad Schnakovszki)2012年

7
“就像您在问题中所写的一样”“不完全是-您不需要sudo作为rc.localroot用户运行。显然,您还应该指定脚本的完整路径。 您还应该&在末尾添加,以便脚本派生,例如/path/to/foobar.py &
goldilocks

1
@goldilocks您能否解释为什么我需要添加&?因为当我不使用它时,一切仍然按预期工作。
Huy.PhamNhu '17

2
@ Huy.PhamNhu回答您的问题:Pi将在启动时以及其他服务启动之前运行该程序。如果您不包括与号,并且您的程序连续运行,则Pi将无法完成其启动过程。&符允许命令在单独的进程中运行,并在主进程运行时继续引导。
阿米·哈宝维

6

将您的脚本(我们将其保存到文件中dnscheck)移动到/etc/init.d/,并设置权限以便可以运行它:

chmod 755 /etc/init.d/dnscheck

LSB初始化标签添加到脚本顶部。您可能需要更改Required-Start / Stop和Description标签以适合您的脚本。

### BEGIN INIT INFO
# Provides:          dnscheck
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start daemon at boot time
# Description:       Enable service provided by daemon.
### END INIT INFO

然后通过运行创建符号链接

update-rc.d /etc/init.d/dnscheck defaults

2
请不要在3 1/2年前这是一个不错的答案的同时,由于Raspbian的新init系统与LSB / SysV样式脚本向后兼容仍然可以使用,但新用户最好还是学习使用新系统(systemd),如果仅添加一行/etc/rc.local还不够。
goldilocks

3

当然,有很多方法可以做到这一点,但是请不要忘记使用cron。如果@reboot在crontab中放入一行,则该命令将在每次重新启动时执行。

为了进行测试,我向用户crontab添加了以下代码行crontab -e @reboot echo "$(date)" >> ~/boot.txt 该方法的好处是,除了启动时间外,您还可以按其他间隔调用作业,而不必编辑初始化脚本。


3

如果使用rc.local文件,这可能有助于故障排除。您可以添加日志记录行以将错误(stderr)和命令输出(stdout)记录到日志文件中。根据此示例,该文件保存在/tmp/rc.local.log中

#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

exec 2> /tmp/rc.local.log      # send stderr from rc.local to a log file
exec 1>&2                      # send stdout to the same log file

# Your other commands...

exit 0

阅读更多


3

我真的很惊讶djb的daemontools在这里没有提到。Daemontools会进行适当的过程监控,您可以添加一些很酷的功能,例如自动旋转的日志记录。TL; DR如果您不熟悉其中任何一项,则每次失败时都会重新启动过程,并在Pi开启时自动启动。如果您编写了一个具有故障模式的错误的python程序,但是您不希望它仅在遇到错误时就死掉,那就太好了。

安装:

sudo apt-get install daemontools daemontools-run

然后按照以下步骤创建守护进程:

这就像将run脚本复制到/etc/service/<my_custom_service_name>另一个特权中一样简单:您可以以任何用户或root身份运行!链接中的详细信息。

FWIW我有一个Pi项目,其中有3个不同的python进程(每个进程都有一个使用CPU时间的执行循环,因此通过使用3个进程,我允许每个进程使用1个CPU内核)。通过Daemontools,我可以确保在插入Pi后,这3个组件都能自动运行并保持运行状态。


简单的解决方案,您的答案节省了很多时间,谢谢..
ShivaGuntuku

2

这是我经常使用的解决方案。

创建一个桌面文件

xyz.desktop

在其中输入以下内容

[Desktop Entry]
Encoding=UTF-8
Type=Application
Name=<Application Name Goes here>
Comment=
Exec=  python /home/pi/Desktop/execute_on_boot.py
StartupNotify=false
Terminal=true
Hidden=false

将此文件粘贴到

/home/pi/.config/autostart/

并重新启动树莓派,它将在新终端中自动运行您的程序


请不要剪切并粘贴多个问题的答案。如果答案相同,则应将较新的版本标记为重复。
史蒂夫·罗比拉德

我没有这样做的唯一原因是导致该页面具有比其他页面更大的视图数量。
Evolutionizer

@SteveRobillard我也不认为我有这样做的必要代表
Evolutionizer

标记信息仅需15次。决定该怎么做是主持人的工作-因此视图的数量无关紧要。系统会自动标记重复的答案。它们是游戏系统的一种形式。因此,我删除了第三个。
史蒂夫·罗比拉德

@SteveRobillard感谢您提供的信息,请原谅我的无知。我在那里将先前的问题标记为重复。
Evolutionizer

2

要使用.py文件,只需将行#!/usr/bin/python放在文件的开头即可。然后使用使其可执行chmod +x filename。接着,直线加/path/to/file.py &/etc/rc.local的前exit 0行(交换/path/to/file.py与路径脚本)。这将使您的python脚本在启动结束时执行。


0

这是对我有用的一个更简单的方法。在LXDE中修改自动启动。

打开终端并按如下所示编辑自动启动文件:

sudo nano /home/pi/.config/lxsession/LXDE-pi/autostart

在底部添加以下文本行(根据需要修改example.py所在的路径)

@/usr/bin/python /home/pi/example.py

ctr-x,然后保存。您可能需要使python脚本可执行,如下所示:

sudo chmod +x /home/pi/example.py

参考用于在LXDE自动起动和参考用于制造蟒可执行


请注意,如果您不以gui
身份

0

这些解决方案对我尝试运行Feh来启动python脚本不起作用。以下工作。登录后启动脚本。

打开终端会话并编辑文件

sudo nano /etc/profile

将以下行添加到文件末尾

/home/pi/your_script_name.sh

用正确的启动脚本名称和路径替换脚本名称和路径。保存并退出

按Ctrl + X退出Nano编辑器,然后按Y保存文件。

这是我的script.sh的样子:

#!/bin/sh
cd /
cd home/pi/
sudo python your_python_sript.py &
exit 0
cd /

我想我使用chmod制作了script.sh和script.py可执行文件

sudo chmod +x home/pi/your_script_name.sh
sudo chmod +x home/pi/your_python_script.py
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.