在启动时运行bash脚本


18

我知道这个问题以前曾被问过,但是我找不到解决问题的方法,只是无法让脚本在启动时运行。这是我的脚本:

#!/bin/bash
iptables -A INPUT -m state --state NEW -p tcp --dport 22 -j ACCEPT 
iptables -A OUTPUT -m state --state NEW -p tcp --sport 22 -j ACCEPT

我把它放进/etc/init.d目录

确保它具有可执行文件,方法是使用 chmod 755 /etc/init.d/iptables.sh

并做了 touch /etc/rc3.d/S01iptables.sh

但什么都没有:( ...有什么建议吗?

[2017年11月]此处接受的答案应视为过时,请参阅/raspberrypi//a/75057/5538

Answers:


12

[请参阅问题中有关此答案已过时的注释。]

尝试使用此命令来确保将脚本添加到引导顺序中:

sudo update-rc.d /etc/init.d/nameofscript.sh defaults

请注意,您可以使用chmod的+ x选项使脚本可执行:

chmod +x /etc/init.d/nameofscript.sh

1
是的,该update-rc.d命令起作用了:D ...我以前用过,但是它似乎只是返回一个错误,所以我忽略了它……感谢您的帮助:D

5
这将是sudo update-rc.d nameofscript.sh defaults,至少在杰西,以避免update-rc.d: error: initscript does not exist: /etc/init.d//etc/init.d/nameofscript.sh
derFunk

此脚本是否必须在合理时间内结束?还是可以将其用于无限循环视频?
clankill3r

19

您还可以设置一个cronjob(请参阅教程)以使其在启动时运行

(sudo) crontab -e

sudo在脚本需要超级用户权限时添加。然后将其添加到您的crontab中:

@reboot /path/to/script.sh

我使用此方法启动脚本,由于某种原因它关闭了所有ssh访问。我必须将驱动器安装在另一个Linux设备上,并注释掉crontab行。
Phill Healey

6

您可以在脚本的底部添加脚本可执行命令,该命令.bashrc在您每次登录时运行脚本

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

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

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

  4. 打开.bashrc进行配置:

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

  6. 保存并退出: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. 添加@bash /path/to/scriptname &新行。如果要运行类似python脚本的内容,请@python mypython.py在新行中放入类似内容。运行脚本文件可能是@./superscript,但是由于某种原因,脚本会无限循环地运行(也许将停止该循环)。

  4. 保存并退出:Ctrl+ XYEnter

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

取自启动时的执行脚本


1

我通常只是添加到执行脚本行/etc/rc.local,例如/path/to/my/script.sh &,具有最后一行之前exit 0。我添加了“&”以将脚本发送到后台,以防它不返回,否则下一条命令将不会执行。

所以在您的情况下,我只需将两行相加

iptables -A INPUT -m state --state NEW -p tcp --dport 22 -j ACCEPT 
iptables -A OUTPUT -m state --state NEW -p tcp --sport 22 -j ACCEPT

在年底/etc/rc.local之前exit 0

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.