Linux

Как запустить сценарий оболочки при запуске системы

На экземпляре 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, но это у меня не работает.

 

Ответ 1

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

#crontab -e

@reboot  /home/user/test.sh

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

 

 Ответ 2

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

chmod +x /etc/init.d/start_my_app

Если это не работает, вам нужно создать символическую ссылку на /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

 

Ответ 3

Простой подход добавить строку в /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

 и немного адаптируйте его под свои цели.

 

Ответ 4

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

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

#!/bin/bash

# chkconfig: 345 99 10

# Описание: автоматический запуск слушателя apex

#

case "$1" in

 'start')

   su - oracle -c "cd /opt/apex ; java -jar apex.war > logs/apex.log 2>logs/apex_error.log &";;

 'stop')

   echo "вставьте сюда что-нибудь для выключения или уничтожения процесса";;

esac

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

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

chkconfig --list apex

chkconfig --add apex

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

 

Ответ 5

Создайте свой собственный исполняемый файл /init. Это не совсем то, что вам нужно, но это работает! Просто выберите произвольный исполняемый файл, например, сценарий оболочки, и загрузите ядро с параметром в командной строке:

init=/path/to/myinit

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

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

Вот минимальная воспроизводимая установка: 

https://github.com/cirosantilli/linux-kernel-module-cheat/tree/f96d4d55c9caa7c0862991025e1291c48c33e3d9/README.md#custom-init.

 

Ответ 6

Во многих предыдущих ответах говорится о запуске чего-либо при загрузке, но часто вы хотите запустить его чуть позже, потому что ваш сценарий зависит, например, от работы сети. Используйте at, чтобы просто добавить эту задержку, например:

at now + 1 min -f /path/yourscript

Вы можете добавить это в /etc/rc.local, а также в cron, например:

# crontab -e

@reboot at now + 1 min -f /path/yourscript



Ответ 7

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

Во-первых, напишите сценарий оболочки и сохраните его в формате .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";

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

Во-вторых, откройте приложение «Startup Application Preferences» (Параметры запуска приложений).

В-третьих, нажмите «Добавить».

В-четвертых, в разделе «Имя» задайте имя. 

В-пятых, в разделе «Команда» перейдите к вашему .sh. 

В-шестых, отредактируйте раздел «Команда» следующим образом:

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

 В-седьмых, нажмите кнопку «Добавить». Вот и все! Готово!

Теперь подтвердите изменения, перезагрузив ваш ПК.

 

Ответ 8

Вы можете использовать микросервисы или оболочки Python 3; при использовании в Ubuntu Server 18.04 (Bionic Beaver) или Ubuntu 19.10 (Eoan Ermine), или Ubuntu 18.10 (Cosmic Cuttlefish):

Создайте микросервис, названный в моем случае «brain_microservice1.service»:

$ nano /lib/systemd/system/brain_microservice1.service

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

[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

 Предоставьте разрешения:

$ chmod -X /lib/systemd/system/brain_microservice*

$ chmod -R 775 /lib/systemd/system/brain_microservice*

 Дайте разрешение на выполнение:

$ systemctl daemon-reload

 Включите данную функцию, это заставит сервис всегда запускаться при запуске системы.

$ systemctl enable brain_microservice1.service

 Затем вы можете протестировать его:

$ sudo reboot now

 Готово!

Это может быть сделано с помощью любого скрипта для запуска shell, react... скрипта запуска базы данных... любого вида системного кода...

 

Схожие статьи

Linux

Как получить информацию о только что запущенном процессе

Linux

Недостатки и уязвимости использования LVM

Linux

Как узнать максимальное количество потоков на процесс в Linux?

Linux

Как завершить дочерний процесс по истечении заданного времени ожидания в Bash