我尝试在Raspberry Pi启动时执行脚本。我希望网络浏览器自动打开。

我已经调查了Upstart,但我正在努力了解它是如何工作的。当我测试它们时,我尝试过的所有脚本都无法正常工作。

评论

您正在运行什么操作系统?在我正在Pi上使用的FreeBSD中,您可以将启动脚本添加到/usr/local/etc/rc.d/,或者仅将内容添加到/etc/rc.local。不同的Linux发行版具有不同的推荐方法。如果要在其上运行X,则应考虑将其添加到.xinitrc或.xsession文件中。

有关X启动过程的更多信息,请参见此处。

请注意,此处接受的答案有一些警告,从技术上讲,除非在特定条件下,否则在启动时不会启动任何操作。请仔细阅读。

您要的是一个在登录时运行的脚本,而不是在pi启动或启动时运行的脚本。两件事截然不同,标题使Google搜索结果倾斜。

如果要在启动时自动启动node.js脚本,请使用pm2。专为此设计的;用于在启动时运行脚本,在日志文件中跟踪其stdout和stderr,重新启动脚本等。

#1 楼


此答案已过时-甚至包含编写时也包含错误的方法。 />要在启动时运行Midori,请看一下本教程。有关DIY解决方案,请继续阅读。


您可以将脚本可执行命令添加到.bashrc的底部,该命令将在每次打开终端时运行脚本(或运行bash的新实例) 。



请确保您位于pi文件夹中:

$ cd ~



创建文件并编写脚本以在文件中运行:

$ sudo nano superscript


保存并退出:Ctrl + X,Y,输入
打开.bashrc进行配置:


.bashrc并非旨在运行脚本。

每次启动非登录交互式外壳程序时都会运行该脚本,并用于配置该外壳程序。 ~/.bashrc: executed by bash(1) for non-login shells


   $ sudo nano .bashrc



向下滚动到底部并添加以下行:./superscript
保存并退出:Ctrl + X,是,请输入


如果您正在寻找可在控制台启动时使用的解决方案,请查看此链接。基本清单:



为启动脚本创建一个文件,并将脚本写入该文件:

$ sudo nano /etc/init.d/superscript


保存并退出:Ctrl + X,Y,输入

使脚本可执行:在启动时运行:

$ sudo chmod 755 /etc/init.d/superscript




如果希望在启动LXDE环境时运行脚本,可以看一下此Raspberry Pi论坛帖子:


导航到~/.config/lxsession/LXDE-pi

打开该文件夹中的autostart文件:

$ sudo update-rc.d superscript defaults


在新行上添加@midori。如果要运行类似python脚本的内容,请在新行上放置类似@python mypython.py的内容。运行脚本文件将是@./superscript,但是由于某种原因,脚本会无限循环运行(也许这会停止该循环)。
保存并退出:Ctrl + X,Y,Enter
重新启动Raspberry Pi进入LXDE环境。


评论


我在寻找有关在启动时设置Midori的教程。不知道为什么有这么多方法可以做这种简单的事情,但是我很高兴它现在可以工作了。

–泰勒·穆里(Tyler Murry)
13年8月2日在1:44

@ syb0rg如果我通过ssh登录,则登录时运行的部分就像超级按钮(+1)一样工作,但是当lxde桌面会话启动时却不能。有没有办法做到这一点 ?

–乔治·普罗恩扎(George Profenza)
2013年9月13日19:50在

@GeorgeProfenza什么时候做$ sudo startx?

–syb0rg
2013年9月13日23:01



只是想指出pyhton脚本将运行,但是如果有任何错误,使用/ etc / xdg / lxsession / LXDE / autostart方法,它将只在后台某处。使用.barshrc也会显示错误,但是确保脚本一开始就很紧是非常重要的(很难找到):)

–乔治·普罗恩扎(George Profenza)
2013年9月25日,下午1:23

当系统启动或用户登录时,仅在打开新终端时才会读取.bashrc(每次用户打开新终端时都将读取.bashrc)。我很困惑这个答案有这么多反对:第一部分是完全错误的。第三部分正确执行GUI程序。

–吉尔斯'所以-不再是邪恶的'
16年7月15日在1:19

#2 楼

我见过的大多数人都这样做(在Raspberry Pi论坛上看过),并且成功完成了自己的工作,就是使用/etc/rc.local

这里您需要做的就是将./myscript放入rc.local文本文件。如果是在python中,请输入python myscript.py。也有疑问,此解决方案出现在Google搜索的前4个结果中!

评论


仅供参考,默认情况下,rc.local具有有关脚本的各种注释,这些注释不执行任何操作且需要更改可执行位。这是不正确的,只需在退出0之前输入脚本命令,它将在启动时运行。确保您的脚本在后台退出运行,否则它将阻止登录提示。是的,那就是我所做的。

– rob
2014年11月20日在22:41

参见raspberry-projects.com/pi/pi-operating-systems/raspbian/…

–乔治·比尔比利斯(George Birbilis)
15年7月3日在17:40

@rob您是说他们建议将该脚本设置为可执行文件吗?通过使用命令python myscript.py运行脚本可以缓解此问题。如果要chmod + x并添加#! / bin / python,您可以通过执行$ pathtofile / myscript.py来运行脚本,其中$ pathtofile是。如果您位于同一目录中,或者文件的绝对或相对路径。

– JFA
15-10-29在8:46



对于诸如浏览器之类的GUI程序来说,这没有好处。 /etc/rc.local仅用于启动系统服务(没有用户界面的程序)。

–吉尔斯'所以-不再是邪恶的'
16年7月15日在1:19

@ ErickM.Sprengel在此线程上使用正确的答案之一,例如此答案。

–吉尔斯'所以-不再是邪恶的'
17年9月2日在19:19

#3 楼

将其添加到crontab
crontab在定义的时间运行命令。

编辑文件:
sudo crontab -e

将行添加到文件(此处为python脚本):
@reboot python3 /home/pi/Desktop/exemple.py &


评论


对此,请注意,从技术上讲,不是crontab运行命令,而是无论如何。关于要添加的列出行,建议为此处定义的命令放置完整路径(在这种情况下,为python3的完整路径),请参见此处

–加纳马♦
16年3月28日在20:39

由于其简单性,这是我一直使用的方法。 +1

–帕特里克·库克(Patrick Cook)
16年5月7日在19:42

对于诸如浏览器之类的GUI程序来说,这没有好处。 /etc/rc.local仅用于启动没有用户界面的程序。

–吉尔斯'所以-不再是邪恶的'
16年7月15日在1:20

在花了很多时间尝试使它与rc.local和init.d以及其他各种各样的东西一起工作之后。谢谢分配!

– Piotr Kula
17年12月1日下午14:58

这在rpi os中由于某种原因不起作用

–丹尼斯
18年7月20日在10:27



#4 楼

自动启动xorg应用程序

如果要启动的脚本需要xorg会话,则可以尝试遵循freedesktop autostart规范,该规范可能会或可能不起作用,具体取决于您所使用的桌面环境。

或者,您可以按照https://wiki.archlinux.org/index.php/autostarting中的描述定位特定的桌面环境。

将脚本作为系统服务运行

如果脚本适合守护程序或“服务”的描述,并且系统正在运行systemd(对于raspbian和大多数现代linuce都是这种情况),则可以将脚本配置为作为systemd服务运行-这提供了对生命周期和执行环境以及(重新)启动脚本的前提条件(例如,网络正在运行)的精细控制。如果发生系统故障(Restart=always和重启之间的延迟,例如RestartSec=10),也可以配置服务重启。

要在系统范围内使用,请在/etc/systemd/system下创建systemd单元文件,例如与vim /etc/systemd/system/autossh.service在一起:

 [Unit]
Description=Autossh keepalive daemon
## make sure we only start the service after network is up
Wants=network-online.target
After=network.target

[Service]
## use 'Type=forking' if the service backgrounds itself
## other values are Type=simple (default) and Type=oneshot
Type=forking
## here we can set custom environment variables
Environment=AUTOSSH_GATETIME=0
Environment=AUTOSSH_PORT=0
ExecStart=/usr/local/bin/ssh-keep-alive.sh
ExecStop=/usr/bin/killall -9 autossh
### NOTE: you can have multiple `ExecStop` lines
ExecStop=/usr/bin/killall ssh
# don't use 'nobody' if your script needs to access user files
# (if User is not set the service will run as root)
#User=nobody

# Useful during debugging; remove it once the service is working
StandardOutput=console

[Install]
WantedBy=multi-user.target
 


另请参见:


[unit]配置
[service]配置

现在我们准备测试服务:



 systemctl start autossh
 


检查服务状态:

 systemctl status autossh
 


停止服务:

 systemctl stop autossh
 


一旦您确认该服务能够按预期工作,请使用以下功能启用它:

 systemctl enable autossh
 



注意:为了安全起见,systemd将在受限环境中运行脚本,类似于crontab脚本的运行方式,因此,请勿对现有的系统变量做任何假设。如果您的脚本需要定义特定的变量,请使用Environment键。在bash脚本的顶部添加set -x,然后运行systemctl status my_service,可能有助于确定脚本失败的原因。通常,始终对所有内容使用绝对路径,包括echocat,或显式定义您的$ PATH。


#5 楼

我想投入两分钱,尽管这是一个老问题,但通常被要求做简单的事情-自动启动。我针对该问题在所有答案中尝试了所有建议的解决方案。他们都没有为我工作。我正在将Raspberry PI Model 2与Raspbian一起使用。

使脚本成功自动启动的唯一方法是通过脚本,如下所示。我说成功是因为我的应用程序按预期方式启动,而没有像以错误的工作路径开头那样的任何问题。

1.创建一个扩展名为.sh的空文件并命名为您想要的任何名称。 br /> 2。完全复制并粘贴以下内容,只是将“您的应用程序名称”更改为刚创建的脚本名称。

  #! /bin/sh

 ### BEGIN INIT INFO
 # Provides:          noip
 # Required-Start:    $remote_fs $syslog
 # Required-Stop:     $remote_fs $syslog
 # Default-Start:     2 3 4 5
 # Default-Stop:      0 1 6
 # Short-Description: Simple script to start a program at boot
 ### END INIT INFO

 #change /direct/path/to/your/application to the path your application is in.
 cd /direct/path/to/your/application      # example cd /home/pi/myprogram/

 #change YourProgramExactName to Exact name of your program that you want to auto start
 ./YourProgramExactName

 exit 0 
 



然后,将脚本文件保存在应用程序文件夹中
,然后打开/home/pi/.config/autostart文件夹。您的情况可能有所不同。只需打开您的主文件夹并启用查看隐藏的文件夹。打开.config/autostart。如果没有看到自动启动文件夹,请在.config文件夹中创建一个名为自动启动的文件夹。
在自动启动文件夹中,您将需要创建到脚本文件的快捷方式,该脚本文件的创建如下。创建一个扩展名为.desktop的空文件。

将以下内容复制并粘贴到空桌面文件中,除非您需要更改CommentNameExecPathIcon字段的值。

[Desktop Entry]
Comment=
Exec=/path/to/Your/application/Name-of-the-script-file (.sh)
Icon=/Path/to/Your/application/Icon/IconName
Name=YourApplicationEXACTNAME
Path=/Path/to/Your/Application-ONLY
Type=Application



更改所有必要字段后,保存并关闭文件。大功告成只需对其进行测试。


注意:这使脚本符合Debian LSBInit:



评论


从技术上讲,此脚本由系统而不是特定用户运行-因此,您的应用程序最好属于/ usr / local / bin / ApplicationName ...?

– SlySven
17年2月11日在11:36

@SlySven“系统”是特定用户。

–lmat-恢复莫妮卡
18年11月13日在11:17

它是以root用户(UID = 0)还是pi用户(UID〜500或1000 IIRC)运行-如果它是以root用户或另一个系统UID(小于500)运行,则传统上最好的做法是存储脚本文件(或它所依赖的任何设备)在根设备上,以便在其他任何设备(例如家庭设备,如果是单独的设备)存在问题的情况下,脚本(或可执行文件)不可用时也不会出现问题系统故障回到单个用户/ bin / sh shell!如今,系统化的方法是在启动PID 1之前先挂载/和/ usr。

– SlySven
18/12/11在22:23

#6 楼

我对此也有麻烦。在运行Raspbian的Raspberry Pi3上,这就是我所做的:


在您的根目录中创建启动shell脚本(我将其命名为“ launch”):


sudo leafpad launch.sh



保存文件
编辑LXDE-pi自动启动文件


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



将此添加到该文件的底部


./launch.sh



重新启动


评论


不要这样做,如果长时间运行该命令可能会中断启动

– Kaan Soral
6月28日16:11

这就是发生的情况:raspberrypi.org/forums/…这是解决方法:raspberrypi.stackexchange.com/a/70527/121533

– Kaan Soral
6月28日下午16:34

#7 楼

新方法-RASPBERRY PI OS。
也可以在其他版本上使用。
创建桌面文件
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/

,然后重新启动树莓派,它将自动在新终端上运行程序。
旧方法-RASBIAN STRETCH
在运行Raspbian的Raspberry Pi3上拉伸一下我所做的事情:
编辑LXDE-pi自动启动文件
    sudo nano /home/pi/.config/lxsession/LXDE-pi/autostart

将此添加到该文件的底部
    @sudo python3 /path/to/your/script.py

保存并重新启动

评论


不要这样做,如果长时间运行该命令可能会中断引导-您需要通过引导到命令行来手动修复它:(

– Kaan Soral
6月28日16:11

实际上,Raspberry Pi OS不支持此方法,它将使用更新的信息来编辑我的答案。

– Amr Sohil
6月29日21:20

这是我找到的最佳解决方案!我一直在寻找几个小时的好方法。所有其他方式要么根本不起作用,要么真的被推迟了。此解决方案在桌面加载后立即启动程序。谢谢!

–兰迪
9月25日下午16:33

太好了,很高兴能够提供帮助:)

– Amr Sohil
9月26日下午17:21

#8 楼

方法1:

要在登录时自动启动命令,请将命令放入用户目录中名为
.bashrc


的文件中(例如/ home / pi)


.bashrc并非旨在运行脚本。

每次启动非登录交互式shell时都会运行该脚本,并用于配置外壳。 ~/.bashrc: executed by bash(1) for non-login shells


例如,该文件可能包含
.com


方法2:

此解决方案非常有效。浏览器加载后,屏幕左上方会出现一个黑色小方块,这似乎是一个常规错误(其他人在论坛上提到过),但全屏模式会隐藏浏览器页面以外的所有内容。

编辑自动启动文件:

chromium-browser --kiosk www.google.com


在每行的开头使用“#”注释所有内容,然后添加以下行

自动运行浏览器

sudo nano /etc/xdg/lxsession/LXDE/autostart 


如有必要,使用配置工具在加电时启用GUI的自动运行

@xset s off
@xset -dpms
@xset s noblank
@midori -e Fullscreen -a http://google.com


如果需要返回到命令提示符,请按
CTRL + ALT + F1

CTRL + ALT + F2

#9 楼

您可以将脚本放在/etc/profile文件的底部。

其他选项对我不起作用,但这可能是因为我将脚本放在了桌面上。

#10 楼

使用命令'python /path/to/your/script.py'创建一个.sh文件
键入'sudo nano /etc/rc.local'并键入.sh文件的路径


之前

exit 0


或者您可以只键入

crontab -e




sudo crontab -e 


如果要在启动时运行脚本,请在

@reboot python /path/to/your/script.py &

文件类型内运行

评论


强烈建议对crontab条目使用完整路径!

–加纳马♦
2016年9月6日14:23在

#11 楼

有用。 (在每次重新引导时,它会自动准备以下提交)

$ cat /etc/rc.local
#!/bin/sh -e
echo "18" > /sys/class/gpio/export
echo "out" > /sys/class/gpio/gpio18/direction
echo "1" > /sys/class/gpio/gpio18/value
exit 0


#12 楼

这通常是我要做的。


将文件存储在raspberry pi主目录中。例如:mycode.py

编辑文件:

sudo nano .bashrc不打算运行脚本。

每次启动非登录交互式外壳程序时都会运行它,并用于配置外壳程序。 .bashrc




转到文件末尾并写入:

~/.bashrc: executed by bash(1) for non-login shells


如果要将输出存储在txt文件中,请按如下所示在步骤3中编辑代码: