Запустить скрипт 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] Принятый ответ здесь следует считать устаревшим, см. Https://raspberrypi.stackexchange.com/a/75057/5538.

Златовласка
источник

Ответы:

12

[См. Примечание в вопросе об устаревании этого ответа.]

Попробуйте использовать эту команду, чтобы убедиться, что ваш скрипт добавлен в последовательность загрузки:

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

Обратите внимание, что вы можете сделать исполняемый скрипт, используя опцию + x с chmod:

chmod +x /etc/init.d/nameofscript.sh
Стив
источник
1
Да, update-rc.dкоманда сработала: D ... Я использовал ее раньше, но, похоже, она просто возвращала ошибку, поэтому я проигнорировал ее, Lol ... Спасибо за помощь: 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
nagyben
источник
Я использовал этот метод для запуска скрипта, и он почему-то отключил все ssh-доступ. Мне пришлось смонтировать диск на другом устройстве Linux и закомментировать строку crontab.
Фил Хили
6

Вы можете добавить свою исполняемую команду скрипта внизу, .bashrcкоторая будет запускать ваш скрипт при каждом входе в систему .

  1. Убедитесь, что вы находитесь в piпапке:

    $ cd ~
    
  2. Создайте файл и напишите скрипт для запуска в файле:

    $ sudo nano superscript
    
  3. Сохранить и выйти: Ctrl+ X, Y,Enter

  4. Откройте .bashrcдля конфигурации:

    $ sudo nano .bashrc
    
  5. Прокрутите вниз и добавьте строку: ./superscript

  6. Сохранить и выйти: Ctrl+ X, Y,Enter


Если вы ищете решение, которое работает при загрузке с консоли , посмотрите эту ссылку . Основное краткое изложение:

  1. Создайте файл для вашего скрипта запуска и запишите свой скрипт в файл:

    $ sudo nano /etc/init.d/superscript
    
  2. Сохранить и выйти: Ctrl+ X, Y,Enter

  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+ X, Y,Enter

  5. Перезапустите Raspberry Pi в среде LXDE.

взято из Выполнить скрипт при запуске

Liam
источник
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.

Джордж
источник