在启动时执行脚本


189

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

我试图找到一个简单的解决方案,(例如将我的脚本放在“启动”目录或类似的目录中),但没有看到类似的东西。

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


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

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

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

您要的是一个在登录时运行的脚本,而不是在pi启动或启动时运行的脚本。两个非常不同的东西,标题被倾斜的谷歌搜索结果。
IAmNaN '18年

Answers:


197

要在启动时运行Midori,请看一下本教程。有关DIY解决方案,请继续阅读。


您可以添加可执行脚本命令的底部.bashrc,将运行脚本,每次打开一个终端(或运行的新实例bash

  1. 确保您位于pi文件夹中:

    $ cd ~
    
  2. 创建文件并编写脚本以在文件中运行:

    $ sudo nano superscript
    
  3. 保存并退出:Ctrl+ XYEnter

  4. 打开.bashrc进行配置:

.bashrc不是打算运行的脚本。

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

   $ sudo nano .bashrc
  1. 向下滚动到底部并添加以下行: ./superscript

  2. 保存并退出:Ctrl+ XYEnter


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

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

    $ sudo nano /etc/init.d/superscript
    
  2. 保存并退出:Ctrl+ XYEnter

  3. 使脚本可执行:

    $ sudo chmod 755 /etc/init.d/superscript
    
  4. 注册要在启动时运行的脚本:

    $ sudo update-rc.d superscript defaults
    

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

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

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

    $ sudo nano autostart
    
  3. 添加@midori新行。如果要运行类似python脚本的内容,请@python mypython.py在新行中添加类似内容。运行脚本文件可能是@./superscript,但是由于某种原因,脚本会无限循环运行(也许会停止该循环)。

  4. 保存并退出:Ctrl+ XYEnter

  5. 将您的Raspberry Pi重新启动到LXDE环境中。


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

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

@GeorgeProfenza什么时候来$ sudo startx
syb0rg 2013年

2
只是想指出pyhton脚本将运行,但是如果有任何错误,使用/ etc / xdg / lxsession / LXDE / autostart方法,它将只在后台某处。使用.barshrc也将揭示错误,但是确保脚本首先紧密是非常重要的(很难发现这一点:))
George Profenza

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

46

我见过的大多数人(在Raspberry Pi论坛上看过)并成功完成自己的工作方式就是使用/etc/rc.local

您在这里需要做的所有事情都放在./myscriptrc.local文本文件中。如果在python中,则放入python myscript.py

从字面上看,这是“一个简单的解决方案,(例如将我的脚本放在某个“启动”目录或类似的目录中”)-也许在您也有疑问时在论坛上进行搜索,此解决方案来自于a的前4个结果谷歌搜索!


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


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

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

1
@ ErickM.Sprengel在此线程上使用正确的答案之一,例如this
吉尔斯

32

将其添加到crontab

crontab在定义的时间运行命令。


编辑文件:

sudo crontab -e

在文件中添加一行(这里是python脚本):

@reboot python3 /home/pi/Desktop/exemple.py &

2
在这里有点挑剔,从技术上讲,不是crontab运行命令,而是无论如何。对于要添加的列出行,建议为此处定义的命令放置完整路径(在本例中为的完整路径python3),请参见此处
Ghanima

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

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

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

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

11

自动启动xorg应用

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

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

将脚本作为Systemd服务运行

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

为了在整个系统范围内使用,请在下创建您的systemd单位文件/etc/systemd/system,例如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

也可以看看:

现在我们可以测试服务了:

systemctl start autossh

检查服务状态:

systemctl status autossh

停止服务:

systemctl stop autossh

验证服务正常运行后,请通过以下方式启用它:

systemctl enable autossh

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


7

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

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

1.创建一个扩展名为.sh的空文件,并根据需要命名。

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 
  1. 然后,将脚本文件保存在您的应用程序文件夹中

  2. 然后,打开/home/pi/.config/autostart文件夹。您的情况可能有所不同。只需打开您的主文件夹并启用查看隐藏的文件夹。打开.config/autostart。如果看不到自动启动文件夹,请在.config文件夹中创建一个名为自动启动的文件夹。

  3. 在autostart文件夹中,您将需要创建一个到您的脚本文件的快捷方式,该脚本文件如下创建。创建一个扩展名为的空文件.desktop

  4. 复制并粘贴到空的桌面文件下面,除非你将需要改变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
    
  5. 更改所有必要字段后,保存并关闭文件。大功告成 只是测试一下。

    • 注意:这使脚本符合Debian LSBInit:https ://wiki.debian.org/LSBInitScripts

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

@SlySven“系统”是特定用户。
有限赎罪

它是以root用户(UID = 0)还是pi用户(UID〜500或1000 IIRC)运行-如果它是以root用户或另一个系统 UID(小于500)运行,则传统上最好的做法是存储脚本文件(或根目录所依赖的任何文件),以便在其他任何设备(例如,home如果是单独的设备)存在问题的情况下,脚本(或可执行文件)文件在以下情况下均不可用时不会出现问题:系统故障回到单个用户/bin/sh外壳!如今的systemd方式是能够安装//usrPID 1日前开始...
SlySven

5

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

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

须藤leafpad launch.sh

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

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

  1. 将此添加到该文件的底部

./launch.sh

  1. 重启

3

在运行Raspbian Stretch的Raspberry Pi3上,这就是我所做的:

编辑LXDE-pi自动启动文件

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

将此添加到该文件的底部

    @sudo python3 /path/to/your/script.py

保存并重启


1

方法1:

要在登录时自动启动命令,请将命令放入一个名为

.bashrc

在用户目录中(例如/ home / pi)

.bashrc不是打算运行的脚本。

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

例如,文件可能包含

chromium-browser --kiosk www.google.com

以全屏形式启动指向网站www.google.com的Chromium


方法2:

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

编辑自动启动文件:

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

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

自动运行浏览器

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

如有必要,请使用配置工具启用开机时自动运行GUI

sudo raspi-config

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

CTRL+ ALT+F2


0

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

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


0

使用命令'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 &

2
强烈建议对crontab条目使用完整路径
加纳马马

-2

它的工作原理。 (在每次重新启动时,它会自动准备以下提交)

$ 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

-2

这通常是我要做的。

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

    sudo nano .bashrc

.bashrc不是打算运行的脚本。

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

  1. 转到文件末尾并输入:

    sudo python mycode.py

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

    sudo python mycode.py >> output.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.