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

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
vijay.shad
источник
Я знаю, что это старый ... но оболочка должна быть '#! / Bin / sh' not '#! / 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/importantscript 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

aronchick
источник
разве это не более распространено в "ln -s /etc/init.d/script" для rcX.d / *?
Озма
8

Вы не должны - и не должны - создавать файлы в /etc/rc.d/rcN.d/; что вы должны сделать вместо этого, это поместить комментарий в вашем чтении сценария инициализации

# 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 - это аргумент командной строки, который передается вашему сценарию, это один из параметров start, stop или restart. В openSUSE я не помню, чтобы у меня была возможность передавать другие аргументы в сценарий при использовании редактора уровней запуска, поэтому я думаю, что это, вероятно, единственные, которые вы должны использовать.

Я не использую CentOS самостоятельно, но кажется, что программа для управления тем, что запускается на каком уровне запуска - ntsysv .

Нил
источник