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


13

Я створив сценарій для запуску сервера (моє перше запитання). Тепер я хочу, щоб він запускався під завантаженням системи та запускав визначений сервер. Що мені робити, щоб це зробити?

Мої висновки говорять про те, що я розміщую цей файл у /etc/init.dмісці, і він виконається, коли система завантажиться. Але я не в змозі зрозуміти, яким буде перший аргумент щодо запуску start? Це попередньо визначено десь використовувати startяк $1? Якщо я хочу мати справу, startallяка запустить усі сервери в скрипті, то якими варіантами я можу керувати?

Мій сценарій такий:

#!/bin/bash

case "$1" in
start)
     start
    ;;
stop)
    stop
    ;;

restart)
    $0 stop
    $0 start
    ;;
*)
    echo "usage: $0 (start|stop|restart)"
;;
esac

Я знаю, що це старе ... але оболонка повинна бути "#! / Bin / sh 'не' #! / Bin / bash '/ bin / sh, швидше за все, працюватиме у випадку з машиною, яка має проблеми під час запуску. (наприклад, / usr / lib неможливо встановити)
Rich Homolka

Відповіді:


19

/etc/init.d- це каталог сценаріїв, в якому відображаються виконувані сценарії. Однак для запуску сценаріїв у певному порядку після запуску системи вам потрібно додати файли до /etc/rc#.dкаталогу. Записи, що з’являються тут, повідомляють вашій системі в тому порядку, і в якому рівні запуску /etc/init.dслід виконувати сценарії . Цифра після rc вказує, на якому рівні запуску працює машина, відповідно до цієї діаграми:

http://en.wikipedia.org/wiki/Runlevel

Тож якщо у вас є:

/etc/init.d/importantscript

Тоді вам потрібні (порожні) файли:

/etc/rc.d/rc3.d/S20importantscript
/etc/rc.d/rc6.d/K20importantscript

S означає запуск, а K означає вбити. Коли ваша машина запуститься, система скаже "Ах, я працюю на RunLevel 3, перейдемо до rc3.d, щоб побачити, які сценарії в '/etc/init.d' потрібно запустити і в якому порядку". У цьому випадку система буде сортувати за 'S', а потім числом після 'S' і виконає '/etc/init.d/importntscript start'. "20" призначений лише для замовлення ... ваш сценарій працюватиме за "S19" та перед "S21". Ви можете створити ці файли, просто виконавши:

sudo touch /etc/rc.d/rc3.d/S20importantscript

Ось також хороший підсумок: http://www.linux.com/news/enterprise/systems-management/8116-an-introduction-to-services-runlevels-and-rcd-scripts


чи не частіше це "ln -s /etc/init.d/script" до rcX.d / *?
озма

8

Ви не повинні --- і не повинні --- створювати файли в /etc/rc.d/rcN.d/; що вам слід зробити замість цього - помістити коментар до свого сценарію init

# chkconfig NNN A B

де NNNє безліч рівнів виконання , в якому ви хочете сценарій активного (наприклад, 345якщо він активний в рівні виконання 3, 4і 5), а також Aі Bпріоритети запуску і зупинки. Потім chkconfig --add foo(якщо присвоєно ім'я вашого сценарію foo) створіть файли у /etc/rc.d/rcN.d/відповідних іменах.

Потім ви можете використовувати , service foo barщоб відправити barповідомлення в скрипт (наприклад, start, stop, що завгодно , - ось де ваш $1виходить від).


0

$ 1 - це аргумент командного рядка, який передається вашому сценарію, він є початком, зупинкою або перезапуском. У OpenSUSE я не пам’ятаю, щоб мати можливість передавати інші аргументи в сценарій при використанні редактора runlevel, що є реальним, тому я думаю, що це, мабуть, єдині, які ви повинні використовувати.

Сам я не використовую CentOS , але здається, що програма для управління тим, що запускається, на якому запущеному рівні - ntsysv .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.