这个问题已经被问过好几次了,但是我似乎并没有利用现有的信息来解决这个问题。
我的Pi运行Raspbian。我有一个名为dnscheck.py的Python脚本,它将永远循环。
我需要它在启动时运行。我知道我必须创建一个包含以下内容的.sh文件
sudo python dnscheck.py &
我不知道该文件应该在哪里或是否应该包含其他文件。我知道init.d文件夹,但是看到框架示例,我想应该有一种更简单的方法来完成此简单任务。
这个问题已经被问过好几次了,但是我似乎并没有利用现有的信息来解决这个问题。
我的Pi运行Raspbian。我有一个名为dnscheck.py的Python脚本,它将永远循环。
我需要它在启动时运行。我知道我必须创建一个包含以下内容的.sh文件
sudo python dnscheck.py &
我不知道该文件应该在哪里或是否应该包含其他文件。我知道init.d文件夹,但是看到框架示例,我想应该有一种更简单的方法来完成此简单任务。
Answers:
如果您想使用框架脚本使用诸如启动,停止,重新启动等命令来控制过程,并根据需要对其进行更改可能是最佳选择。
如果只想启动该过程,请将命令放入/etc/rc.local
。(我手头没有RPi,但我在线阅读有一个“ exit 0”行,应该将命令放在这行上方)
rc.local
root用户运行。显然,您还应该指定脚本的完整路径。 您还应该&
在末尾添加,以便脚本派生,例如/path/to/foobar.py &
。
&
?因为当我不使用它时,一切仍然按预期工作。
将您的脚本(我们将其保存到文件中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
/etc/rc.local
还不够。
如果使用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
阅读更多
我真的很惊讶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个组件都能自动运行并保持运行状态。
这是我经常使用的解决方案。
创建一个桌面文件
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/
并重新启动树莓派,它将在新终端中自动运行您的程序
这是对我有用的一个更简单的方法。在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
这些解决方案对我尝试运行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