Як запустити скрипт оболонки при запуску


366

У екземплярі 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, але це не працює для мене.


5
Я не досвідчений у подібних матеріалах, але думаю, що init.dрішення ( тут ) слід віддавати перевагу rc.localрішенню, оскільки останній - це старий інструментарій, який є корисним лише для того, щоб новий інструмент був сумісним назад.
erikbwork

pm2 запуск 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
у папці кореня тощо немає мого каталогу 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

343

Встановіть для цього кронтаб

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

після кожного запуску буде запущений тестовий сценарій.


4
Це єдине рішення, яке працювало для мене без проблем! дякую
whoopididoo

20
Це найкраще рішення, @reboot sh $HOME/test.shу
кронтабі

4
@ user3667089 насправді це не працює. Я відкриваю термінал, ввожу "crontab -e", з'являється вікно, де я пишу в "@reboot sh /home/user/test.sh", але він не працює при запуску. Де я роблю це неправильно?
MycrofD

@ user3667089 звичайні рядки за замовчуванням "# Редагувати цей файл на ...", а потім рядок, який я написав "@reboot sh /home/.../.sh". Я також спробував "@reboot /home/.../.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 продовжувати виконувати)

Якщо ви хочете повний скрипт init, у дистрибутиві debian є файл шаблонів, так:

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

і трохи адаптувати його.


2
Дякую! Цей підхід виявився найкращим, враховуючи прості вимоги. Я впевнений, що мені потрібно вказати користувача, інакше, коли потрібно вручну зупинити додаток (запустивши stop_my_app), мені доведеться це робити sudo, ні? Також мені цікаво, у чому саме полягає функція задніх амперсандів (?).
meetamit

3
Користувач залежить від вашої програми. Але якщо це зовсім не потрібно для запуску як root, уникайте цього. &запустити процес у фоновому режимі
Жилль Кінот

2
sputnick, вибачте, але я повинен відзначити Корен як загальноприйнятої відповіді, в основному з - за того, що @ erikb85 вказав, а й тому , що мій початковий питання , поставлене на init.dспосіб робити речі (ваша відповідь була просто простий обхідний шляхом для мене в той час) . Ця публікація отримує багато переглядів і голосів, тому важливо зберігати точність.
meetamit

4
Здається, не варто згадувати, що кінцевий ампер і фоновий процес і дозволяє rc.local продовжувати виконувати.
mchicago

Дякую за це! Провели останні кілька годин, вдарившись головою об стіну, поки я намагався зробити послугу, але нічого не вийшло. Спробував це, працює як шарм!
Марко Грешак

34

Це я роблю це в системах Red Hat Linux .

Покладіть свій скрипт /etc/init.d, який належить root та виконуваному файлу. У верхній частині сценарію ви можете дати директиву для chkconfig. Наприклад, наступний скрипт використовується для запуску програми Java як користувача oracle.

Назва сценарію - /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.


Тим часом я експериментував із пакетом під назвою supervisord ( supervisord.org ), який доступний у сховищі epel. Він може використовуватися для запуску програм і для їх моніторингу, перезавантаження їх після відмови.
Сауле

Замість того, щоб набрати: "chkconfig --add service_name" після додавання скрипту в папку /etc/init.d/ ви можете ввести: "chkconfig service_name"
Драган Радевич

21

Введіть, cronвикористовуючи sudo:

sudo crontab -e

Додати команду для запуску при запуску, в цьому випадку сценарій:

@reboot sh /home/user/test.sh

Зберегти:

Натисніть ESC потім: x для збереження та виходу, або натисніть ESC, а потім ZZ (це зсув + zz)

Тестовий тест :

  1. Запустіть свій тестовий скрипт без крона, щоб переконатися, що він справді працює.

  2. Переконайтеся, що ви зберегли свою команду в cron, використовуйте sudo crontab -e

  3. Перезавантажте сервер, щоб підтвердити, що все працює sudo @reboot


Мені це дуже подобається. Дякую! Пс. не використовувати, sudoякщо ви хочете виконати певну команду під час запуску за допомогою поточного користувача.
небезпека89

Де ця інформація повинна зберігатися? Не в /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
SeanOlson

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

Будь ласка, дивіться цю сторінку на кіберциті .


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


2

Це просте рішення працювало для мене на екземплярі Amazon Linux під управлінням CentOS. Відредагуйте /etc/rc.d/rc.localфайл і поставте туди команду. У цьому файлі зазначається, що він буде виконаний після всіх інших сценаріїв init. Тож будьте обережні в цьому плані. Ось як виглядає файл у мене зараз. введіть тут опис зображення. Останній рядок - це назва мого сценарію.


1

Абсолютний найпростіший метод, якщо все, що ви хочете запустити, - це простий скрипт, (або що завгодно) - якщо у вас є gui для використання системи> налаштування, а потім запуску програм.

просто перейдіть до потрібного сценарію і там ви йдете. (зробити сценарій виконуваним)


3
Це насправді не працює при запуску, а при вході в систему, що є досить великою різницею. Це також залежить від певної установки, оскільки у вас не буде "Система> Налаштування" в кожній системі (особливо не на серверах).
джазпі

пошуковий термін "linux Execute at startup" привів мене до цієї відповіді, на яку я шукав. Незважаючи на те, що він не відповідає на запитання ОП, це може допомогти нобукам linux (ubuntu), як я, тому заслуговує на надбавку. Мені це теж не подобається, але це прагматизм.
тимаро


1

У Любунту довелося зіткнутися з протилежною ситуацією. Skype почав працювати після завантаження, і я знайшов у ~/.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

Видалення цього файлу допомогло мені.


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 каракатиця), я завжди люблю ці кроки, і це також працювало завжди :

  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. Фініш = УСПІХ !!

Це можна зробити з тим же скриптом тіла, щоб запустити оболонку, реагувати ... сценарій запуску бази даних ... будь-який вид os коду ... сподіваюся, що ця допомога u ...

...



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


2
Це неточно. ~/.bash_profileвиконується, коли користувач входить у систему - не тоді, коли система завантажується. У первісному питанні наміром є запуск сервера додатків Node.js після запуску машини. Для вашого рішення потрібен користувач людини спочатку увійти в машину до запуску сервера Node.js. І якщо якась проблема спричинить перезавантаження сервера протягом ночі, додаток ніколи не оживе, поки людина не ввійде в систему.
meetamit

-6

Для деяких людей це спрацює:

Ви можете просто додати таку команду до системиНалаштуванняЗапуск програм :

bash /full/path/to/your/script.sh

Я не бачу цього в меню системних налаштувань. Але я це бачу, коли шукаю в запуску програм.
OKGimmeMoney

Це насправді не працює при запуску, а при вході в систему, що є досить великою різницею. Це також залежить від певної установки, оскільки у вас не буде "Система> Налаштування" в кожній системі (особливо не на серверах).
джазпі

3
Ця відповідь здається більше для робочого столу Ubuntu / Linux, але користувач насправді вимагає допомоги для екземпляра AWS EC2 Linux, у якому, наскільки я знаю, немає графічного інтерфейсу.
Vini.g.fer
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.