it-roy-ru.com

Как запустить скрипт Shell при запуске

В экземпляре Amazon linux у меня есть два скрипта с именами start_my_app и stop_my_app, которые запускают и останавливают forever (который, в свою очередь, запускает мое приложение node.js). Я использую эти сценарии, чтобы вручную запускать и останавливать приложение моего узла. Все идет нормально.

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

311
meetamit

В файле, который вы поместили в /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
256
Jonathan Muller

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

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

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

236
Hemant kumar

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

/PATH/TO/MY_APP &

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

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

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

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

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

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

118
Gilles Quenot

Это то, как я делаю это в системах Red Hat

Поместите ваш скрипт в /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

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

31
Saule

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

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

chmod +x /path_to_you_file/your_file

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

crontab -e

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

@reboot  /path_to_you_file/your_file

Так просто!

10
Luciano Ghilarducci

Другой вариант - добавить команду @reboot в ваш crontab.

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

9
chris

Введите 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

9
user3140639

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

chmod +x PATH_TO_YOUR_SCRIPT/start_my_app 

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

update-rc.d start_my_app defaults 100

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

4
IR PRO

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

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

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

init=/path/to/myinit

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

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

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

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

Для 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
Mikhail Ionkin

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

1
shshnk

В Lubuntu мне пришлось столкнуться с противоположной ситуацией. 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
aerijman

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

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

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

0
Juko

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

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

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