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

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

我需要它在引导时运行。我知道我必须创建一个包含类似

sudo python dnscheck.py &


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

评论

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

#1 楼

如果要使用骨架脚本通过启动,停止,重新启动等命令控制过程,并根据自己的目的对其进行更改,则可能是最佳选择。命令进入/etc/rc.local。 (我手头没有RPi,但我在线阅读了其中有一个“ exit 0”行,应将命令放在此行上方)

评论


有效!我必须添加将脚本和rc.local的权限设置回755(读/写/执行)的必要条件。不知道两者是否都需要此设置,但对我有用。非常感谢您的帮助!

–弗拉德·施纳科夫斯基(Vlad Schnakovszki)
2012年12月27日在0:07

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

–金锁♦
2015年2月20日在13:15



@goldilocks您能否解释为什么我需要添加&?因为当我不使用它时,一切仍然按预期运行。

–Huy.PhamNhu
17年7月29日在3:21

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

–胺Harbaoui
18年7月27日在14:49

#2 楼

将您的脚本(我们将其保存到文件dnscheck)移动到/etc/init.d/,并设置权限以便可以运行它:您的脚本。您可能需要更改“必需的开始/停止”和“描述”标签以适合您的脚本。 />
chmod 755 /etc/init.d/dnscheck


评论


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

–金锁♦
16年7月3日在17:32

#3 楼

2020更新:
如今,包括Raspbian在内的现代Linux发行版都使用systemd而不是旧式SysV作为初始化系统。为了实现下游兼容性,SysV仅由systemd模拟,但是随着时间的流逝,它会失去越来越多的支持,因此

您不应该再使用SysV,尤其是/etc/rc.local

有关更多信息

脚本中的无穷循环,它应该作为服务在后台运行,因此您可以使用通过Unit文件定义的systemd服务。这是您的脚本的一个简单示例。使用以下命令创建它:

rpi ~$ sudo systemctl --force --full edit dnscheck.service


在空的编辑器中插入以下语句,保存并退出编辑器: br />这可能太简单了,您必须为所需的环境添加更多设置。请查看man systemd.unitman systemd.service的其他条件。

启用和监视服务的方法如下:

[Unit]
Description=Check DNS queries
After=multi-user.target

[Service]
ExecStart=/usr/bin/python3 /home/pi/dnscheck.py

[Install]
WantedBy=multi-user.target


将在期刊中找到:

rpi ~$ sudo systemctl enable --now dnscheck.service
rpi ~$ systemctl status dnscheck.service


评论


这个“答案”已经晚了8年!为什么要复活死者?

–地铁
20 Mar 24 '20 at 10:04

@Milliways您不了解第一行:2020更新:? 2020年是2020年。

– Ingo
20-3-24在10:08



您定期建议他人接受答案,以停止无用的问题重现-但这就是您的“答案”将要实现的一切,就是使死者复活。否则,这个人本可以安全地留在坟墓中。

–地铁
20 Mar 24 '20 at 10:13

你把这个问题留在坟墓里是错误的。在其他问题上作为重复的答案引用。因此,我认为保持最新状态非常重要,这样OP才能不遵循其他已过时的旧东西。这就是我更新它的原因。

– Ingo
20-3-24在10:22



@Milliways忘记引用您。请注意我上面的评论。

– Ingo
20-3-25的10:00

#4 楼

当然,有很多方法可以做到这一点,但是请不要忘记使用cron。如果在crontab中放入@reboot行,则该命令将在每次重新启动时执行。 />这种方法的好处是,除了启动时间之外,您还可以按其他间隔调用作业,而不必编辑初始化脚本。

#5 楼

如果使用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


了解更多信息

#6 楼

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

安装:


sudo apt-get install daemontools daemontools-run


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


http://samliu.github .io / 2017/01/10 / daemontools-cheatsheet.html

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

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

评论


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

– ShivaGuntuku
18年2月6日在18:09

#7 楼

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

创建桌面文件

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/


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

评论


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

–史蒂夫·罗比拉德(Steve Robillard)
15年8月25日在19:29

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

–进化器
15年8月25日在19:40

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

–进化器
15年8月25日在19:46

标记帖子仅需15个代表。决定该怎么做是主持人的工作-因此视图的数量无关紧要。系统会自动标记重复的答案。它们是游戏系统的一种形式。因此,我删除了第三个。

–史蒂夫·罗比拉德(Steve Robillard)
15年8月25日在19:50

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

–进化器
15年8月25日在19:53

#8 楼

要使用.py文件,只需将#!/usr/bin/python行放在文件的开头。然后使用chmod +x filename使它可执行。接下来,在/path/to/file.py &行之前将/etc/rc.local行添加到exit 0(将/path/to/file.py替换为脚本路径)。

#9 楼

这是对我有用的甚至更简单的方法。在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中自动启动的参考和使python可执行文件的参考

评论


请注意,如果您不以gui身份启动,则此操作将无效(例如:无头运行pi)

–Havnar
16 Mar 9 '16 at 13:12

#10 楼

这些解决方案对我尝试运行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可执行文件br />
sudo chmod +x home/pi/your_script_name.sh
sudo chmod +x home/pi/your_python_script.py