Как запустить скрипт оболочки при запуске

367

На Amazon S3 , например Linux, у меня есть два сценария под названием start_my_appи stop_my_appкоторые начинаются и остановка навсегда (что , в свою очередь , запускает мое приложение Node.js). Я использую эти сценарии для запуска и остановки приложения Node.js вручную. Все идет нормально.

Моя проблема: я также хочу настроить его так, чтобы start_my_appон запускался всякий раз, когда система загружается. Я знаю, что мне нужно добавить файл внутрь, init.dи я знаю, как символически связать его с соответствующим каталогом внутри rc.d, но я не могу понять, что на самом деле нужно поместить в файл, в который я помещаю init.d. Я думаю, что это должна быть только одна строка, start_my_appно это не сработало для меня.

meetamit
источник
5
Я не разбираюсь в подобных вещах, но я думаю, что init.dрешение ( здесь ) должно быть предпочтительнее rc.localрешения, потому что последнее - это старый инструмент, который все еще может использоваться только потому, что новый инструмент обратно совместим.
erikbwork
pm2 start my_app; запуск pm2; pm2 save github.com/Unitech/pm2
Unitech

Ответы:

292

В файле, который вы вставили, /etc/init.d/вы должны установить его исполняемым с помощью:

chmod +x /etc/init.d/start_my_app

Благодаря @meetamit, если это не работает, вы должны создать символическую ссылку на /etc/rc.d/

ln -s /etc/init.d/start_my_app /etc/rc.d/

Обратите внимание, что в последнем Debian это не будет работать, поскольку ваш скрипт должен быть LSB-совместимым (по крайней мере, выполнить следующие действия: запуск, остановка, перезапуск, принудительная перезагрузка и состояние): https: //wiki.debian .org / LSBInitScripts

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

/var/myscripts/start_my_app

И не забудьте добавить поверх этого файла:

#!/bin/sh
Джонатан Мюллер
источник
6
Я сделал это, и он не побежал. будет ли он запускаться автоматически только потому, что он находится в /etc/init.d или мне нужно что-то сделать сверху, чтобы запланировать его запуск при запуске системы?
амфибия
4
@amphibient Не совсем достаточно ... Вам также нужно создать символическую ссылку на этот файл (с помощью lnкоманды) на каталог внутриrc.d
meetamit
23
в моей корневой директории etc нет директории rc.d .. это ошарашило меня, разве это не важный каталог, который должен запустить Linux? Это просто не хватает моей ОС, кажется, работает нормально. Должен ли я создать это? Я вижу кучу файлов с одинаковыми именами, например, «rc1.d» вплоть до «rc5.d»
OKGimmeMoney
3
У меня нет /etc/rc.dпапок, но у меня есть /etc/rcX.dпапки (т.е. /etc/rc0.d , /etc/rc1.d , /etc/rcS.d ), также есть файл /etc/rc.local . Я думаю, что вы должны создать символические ссылки в пользовательской папке, например /etc/rc9.dили в одной из существующих ... (Ubuntu Server 14.04)
F8ER
2
Этот вопрос помог мне с этим: unix.stackexchange.com/questions/28679/…
seth10
344

Установите crontab для этого

#crontab -e
@reboot  /home/user/test.sh

после каждого запуска будет запускаться тестовый скрипт.

Хемант Кумар
источник
4
Это единственное решение, которое работает для меня без проблем! спасибо
whoopididoo
20
Это лучшее решение, @reboot sh $HOME/test.shв crontab еще чище
user3667089
4
@ user3667089 на самом деле, это не работает. Я открываю терминал, ввожу "crontab -e", появляется окно, где я пишу в "@reboot sh /home/user/test.sh", но оно не запускается при запуске. Где я делаю это неправильно?
MycrofD
1
@ user3667089 обычные строки по умолчанию '# Edit this file to ...' и затем строка, которую я написал '@reboot sh /home/.../.sh'. Я также пробовал '@reboot /home/.../.sh' без начального "sh", но без результатов.
MycrofD
3
@MycrofD вы crontab -lдолжны показать, @reboot sh $HOME/test.shчтобы подтвердить, что оно действительно установлено.
user3667089
124

Простой подход - добавить строку в /etc/rc.local:

/PATH/TO/MY_APP &

или если вы хотите запустить команду как специальный пользователь:

su - USER_FOOBAR -c /PATH/TO/MY_APP &

(конечный амперсанд окружает процесс и позволяет rc.local продолжить выполнение)

Если вам нужен полный скрипт инициализации, в дистрибутиве Debian есть файл шаблона, поэтому:

cp /etc/init.d/skeleton /etc/init.d/your_app

и немного его адаптировать.

Жиль Квено
источник
2
Спасибо! Этот подход оказался наиболее эффективным с учетом простых требований. Я почти уверен, что мне НЕОБХОДИМО указать пользователя, в противном случае при необходимости вручную остановить приложение (запустив stop_my_app), я бы сделал это sudo, не так ли? Кроме того, мне интересно, какова функция конечного амперсанда (?).
Метамит
3
Пользователь зависит от вашего приложения. Но если нет необходимости запускать с правами root, избегайте этого. &запустить процесс в фоновом режиме
Gilles Quenot
2
sputnick, извини, но я должен пометить Корена как принятый ответ, в основном из-за того, на что указал @ erikb85, а также потому, что мой первоначальный вопрос касался init.dспособа работы (твой ответ был для меня в то время более простым решением) , Этот пост получает много просмотров и голосов, поэтому важно быть точным.
Meetamit
4
Не следует упоминать, что завершающий амперсанд создает фон для процесса и позволяет rc.local продолжить выполнение.
Чикаго
Спасибо за это! Проведите последние несколько часов, ударяя головой о стену, пока я пытался сделать услугу, но ничего не получалось. Пробовал это, работает как шарм!
Марко Грешак
35

Я так делаю в системах Red Hat Linux .

Поместите ваш скрипт /etc/init.d, принадлежащий пользователю root и исполняемый файл. В верхней части сценария вы можете указать директиву chkconfig. Пример, следующий скрипт используется для запуска приложения Java как пользовательский оракул.

Название сценария /etc/init.d/apex

#!/bin/bash
# chkconfig: 345 99 10
# Description: auto start apex listener
#
case "$1" in
 'start')
   su - oracle -c "cd /opt/apex ; java -jar apex.war > logs/apex.log 2>logs/apex_error.log &";;
 'stop')
   echo "put something to shutdown or kill the process here";;
esac

Это говорит о том, что скрипт должен работать на уровнях 3, 4 и 5, а приоритет для запуска / остановки - 99 и 10.

Затем, как пользователь, rootвы можете использовать, chkconfigчтобы включить или отключить скрипт при запуске:

chkconfig --list apex
chkconfig --add apex

И вы можете использовать service start/stop apex.

Saule
источник
Тем временем я экспериментировал с пакетом, называемым supervisord ( supervisord.org ), который доступен в репозитории epel. Его можно использовать для запуска программ и их мониторинга, перезапуская их при сбое.
Сауле
Вместо ввода: "chkconfig --add service_name" после помещения скрипта в папку /etc/init.d/ вы можете ввести: "chkconfig service_name on"
Dragan Radevic
23

Введите cronс помощью sudo:

sudo crontab -e

Добавьте команду для запуска при запуске, в этом случае скрипт:

@reboot sh /home/user/test.sh

Сохранить:

Нажмите ESC, затем: x, чтобы сохранить и выйти, или нажмите ESC, затем ZZ (это shift + zz)

Тест Тест Тест :

  1. Запустите тестовый скрипт без cron, чтобы убедиться, что он действительно работает.

  2. Убедитесь, что вы сохранили свою команду в cron, используйте sudo crontab -e

  3. Перезагрузите сервер, чтобы подтвердить, что все работает sudo @reboot

user3140639
источник
Мне это очень нравится. Спасибо! Ps. не используйте, sudoесли вы хотите выполнить определенную команду во время запуска с использованием текущего пользователя.
danger89
Где эта информация должна храниться? Не в /tmp??
Питер Мортенсен
15

Просто добавьте строку в ваш crontab.

Убедитесь, что файл исполняемый:

chmod +x /path_to_you_file/your_file

Чтобы отредактировать файл crontab:

crontab -e

Строка, которую вы должны добавить:

@reboot  /path_to_you_file/your_file

Так просто!

Лучано Гилардуччи
источник
Это не работает для меня, я что-то пропустил? # uname -a Linux accton-xp70a0-26-a1 3.11.10-301.fc20.x86_64 #1 SMP Thu Dec 5 14:01:17 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
Это сработало для меня в CentOs 7. Для тех, у кого возникли проблемы, мне нужно было создать сценарий оболочки, сделать его исполняемым (chmod + x file_name) и вызвать сценарий оболочки из cron, который, в свою очередь, вызывает узел path_to_file / index.js.
ШонОлсон
11

Другим вариантом является наличие команды @reboot в вашем crontab.

Не каждая версия cron поддерживает это, но если ваш экземпляр основан на Amazon Linux AMI, он будет работать.

Крис
источник
6

Ты можешь это сделать :

chmod +x PATH_TO_YOUR_SCRIPT/start_my_app 

затем используйте эту команду

update-rc.d start_my_app defaults 100

Пожалуйста, смотрите эту страницу на Cyberciti .

ИК ПРО
источник
1
У меня есть довольно скромная установка, построенная на yocto, и это был единственный способ заставить работать мой скрипт. Спасибо.
Каталин Василе
3

Создайте свой собственный исполняемый файл / init

Это не то, что вы хотите, но это весело!

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

init=/path/to/myinit

В конце загрузки ядро ​​Linux запускает первый исполняемый файл пользовательского пространства по указанному пути.

Несколько проектов предоставляют популярные initисполняемые файлы, используемые основными дистрибутивами, например, systemd, и в большинстве дистрибутивов init запускает несколько процессов, используемых при нормальной работе системы.

Но мы можем использовать /initего для запуска собственных минимальных сценариев, чтобы лучше понять нашу систему.

Вот минимальная воспроизводимая настройка: https://github.com/cirosantilli/linux-kernel-module-cheat/tree/f96d4d55c9caa7c0862991025e1291c48c33e3d9/README.md#custom-init

Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
источник
2

Это простое решение работало для меня на экземпляре Amazon Linux под управлением CentOS. Отредактируйте ваш /etc/rc.d/rc.localфайл и поместите команду там. В этом файле упоминается, что он будет выполнен после всех других сценариев инициализации. Так что будьте осторожны в этом отношении. Вот как файл выглядит для меня в настоящее время. введите описание изображения здесь, Последняя строка - это название моего сценария.

shshnk
источник
1

Абсолютно самый простой метод, если все, что вы хотите запустить, - это простой скрипт (или что-то еще), если у вас есть графический интерфейс для использования системных> предпочтений, а затем запуска приложений.

просто перейдите к нужному сценарию и начинайте. (сделать исполняемый скрипт)

fieldsweeper
источник
3
Это на самом деле не запускается при запуске, но при входе в систему, что является довольно большой разницей. Это также зависит от определенной настройки, поскольку у вас не будет «Система> Настройки» на каждой системе (особенно на серверах).
Jazzpi
поисковый запрос «linux execute at startup» привел меня к этому ответу, который я искал. Несмотря на то, что он не отвечает на вопрос от OP, это может помочь новичкам linux (ubuntu), таким как я, так что это заслуживает одобрения. Мне это тоже не нравится, но это прагматизм.
тимаро
1

Для Debian 9 см. Https://askubuntu.com/questions/228304/how-do-i-run-a-script-at-start-up . Это помогло мне. Короткая версия для Debian 9: добавьте команды (от имени root) в /etc/rc.local

/path_to_file/filename.sh ||  exit 1   # Added by me
exit 0

Вероятно, /path_to_file/filename.sh должен быть исполняемым (я так думаю).

Михаил Ионкин
источник
1

В Lubuntu мне пришлось столкнуться с противоположной ситуацией. Скайп запускается после загрузки и я нашел в ~/.config/autostart/файле skypeforlinux.desktop. Содержание файла выглядит следующим образом:

[Desktop Entry]
Name=Skype for Linux
Comment=Skype Internet Telephony
Exec=/usr/bin/skypeforlinux
Icon=skypeforlinux
Terminal=false
Type=Application
StartupNotify=false
X-GNOME-Autostart-enabled=true

Удаление этого файла помогло мне.

aerijman
источник
0
  • Добавьте ваш скрипт в каталог /etc/init.d/
  • Обновите свои уровни выполнения rc: $ update-rc.d myScript.sh defaults NNгде NN - порядок, в котором он должен выполняться. Например, 99 будет означать, что он будет работать после 98 и до 100.
Кибром Гебре
источник
0

Работа с микросервисами или оболочкой Python 3; используя Ubuntu Server 18.04 (Bionic Beaver) или Ubuntu 19.10 (Eoan Ermine) или Ubuntu 18.10 (Cosmic Cuttlefish), мне всегда нравятся эти шаги, и это тоже работает всегда :

  1. Создание микросервиса с именем p, например, «brain_microservice1.service»:

    $ nano /lib/systemd/system/brain_microservice1.service
  2. Внутри этого нового сервиса, в котором вы находитесь:

    [Unit]
    Description=brain_microservice_1
    After=multi-user.target
    
    [Service]
    Type=simple
    ExecStart=/usr/bin/python3.7 /root/scriptsPython/RUN_SERVICES/microservices    /microservice_1.py -k start -DFOREGROUND
    ExecStop=/usr/bin/python3.7 /root/scriptsPython/RUN_SERVICES/microservices/microservice_1.py -k graceful-stop
    ExecReload=/usr/bin/python3.7 /root/scriptsPython/RUN_SERVICES/microservices/microservice_1.py -k graceful
    PrivateTmp=true
    LimitNOFILE=infinity
    KillMode=mixed
    Restart=on-failure
    RestartSec=5s
    
    [Install]
    WantedBy=multi-user.target
  3. Дайте разрешения:

    $ chmod -X /lib/systemd/system/brain_microservice*
    $ chmod -R 775 /lib/systemd/system/brain_microservice*
  4. Дайте разрешение на исполнение тогда:

    $ systemctl daemon-reload
  5. Включите затем, это будет делать то всегда запускаться при запуске

    $ systemctl enable brain_microservice1.service
  6. Тогда вы можете проверить это;

    $ sudo перезагрузится сейчас

  7. Готово = УСПЕХ !!

Это можно сделать с помощью того же основного сценария, чтобы запустить оболочку, отреагировать ... сценарий запуска базы данных ... любой код ОС ... надеюсь, это поможет вам ...

...

Ренан Моура
источник
0

Вот более простой способ!

Во-первых: написать сценарий оболочки и сохранить его .sh вот пример

#!/bin/bash
Icoff='/home/akbar/keyboardONOFF/icon/Dt6hQ.png'
id=13
fconfig=".keyboard"
echo "disabled" > $fconfig
xinput float $id
notify-send -i $Icoff "Internal Keyboard disabled";

этот скрипт отключит внутреннюю клавиатуру при запуске.

Второе: откройте приложение «Настройки запуска приложения»

введите описание изображения здесь

введите описание изображения здесь

Третье: нажмите Добавить. четвертое: в разделе ИМЯ укажите имя. пятое: в разделе команд перейдите к вашему .sh. шестое: отредактируйте свой командный раздел на:

bash <space> path/to/file/<filename>.sh <space> --start

седьмое: нажмите кнопку Добавить. Это оно! Законченный!

Теперь подтвердите, перезагрузив компьютер.

ура!

Акбар Али
источник
-1

Безболезненный, самый простой и универсальный метод - просто выполнить его с помощью ~.bash_profileили ~.profile (если у вас нет файла bash_profile) .

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

У меня есть этот пример внизу; ~\Desktop\sound_fixer.sh

Juko
источник
2
Это неточно. ~/.bash_profileвыполняется, когда пользователь входит в систему, а не при загрузке системы. В первоначальном вопросе целью было запустить сервер приложений Node.js при запуске компьютера. Ваше решение потребует, чтобы пользователь-пользователь сначала вошел в систему до запуска сервера Node.js. И, если какая-то проблема вызывает перезагрузку сервера в одночасье, приложение никогда не вернется к жизни, пока человек не войдет обратно.
meetamit
-6

Для некоторых людей это будет работать:

Вы можете просто добавить следующую команду в СистемаНастройкиЗапускаемые приложения :

bash /full/path/to/your/script.sh
SagarSave
источник
Я не вижу этого в меню системных настроек. Но я вижу это, когда я ищу в панели запуска приложений.
OKGimmeMoney
Это на самом деле не запускается при запуске, но при входе в систему, что является довольно большой разницей. Это также зависит от определенной настройки, поскольку у вас не будет «Система> Настройки» на каждой системе (особенно на серверах).
Jazzpi
3
Этот ответ кажется больше для рабочего стола Ubuntu / Linux, но пользователь фактически запрашивает помощь для экземпляра AWS EC2 Linux, который, насколько я знаю, не имеет графического интерфейса.
Vini.g.fer