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?

Linux

Как узнать, взломан ли мой Linux-сервер?

Linux

Определение переменной с экспортом или без него

Как просто удалить старые версии ядра Ubuntu в Linux Mint
Linux

Как просто удалить старые версии ядра Ubuntu в Linux Mint

×