Jak wykonać skrypt powłoki podczas uruchamiania?

13

Stworzyłem skrypt do uruchomienia serwera (moje pierwsze pytanie). Teraz chcę, aby uruchomił się przy starcie systemu i uruchomił zdefiniowany serwer. Co powinienem zrobić, aby to zrobić?

Z moich ustaleń wynika, że ​​umieszczam ten plik w /etc/init.dlokalizacji, a zostanie on uruchomiony po uruchomieniu systemu. Ale nie jestem w stanie zrozumieć, jaki będzie pierwszy argument przy starcie start? Czy jest to predefiniowane miejsce do wykorzystania startjako $1? Jeśli chcę mieć skrzynkę startall, która uruchomi wszystkie serwery w skrypcie, jakie są opcje, którymi mogę zarządzać?

Mój skrypt jest taki:

#!/bin/bash

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

restart)
    $0 stop
    $0 start
    ;;
*)
    echo "usage: $0 (start|stop|restart)"
;;
esac
vijay.shad
źródło
Wiem, że to stare ... ale powłoka powinna mieć postać „#! / Bin / sh”, a nie „#! / Bin / bash” / bin / sh jest bardziej prawdopodobne, że będzie działać w przypadku komputera, który ma problemy podczas uruchamiania (np. nie można zamontować / usr / lib)
Rich Homolka

Odpowiedzi:

19

/etc/init.dto katalog skryptów, w którym pojawiają się skrypty wykonywalne. Aby jednak uruchamiać skrypty w określonej kolejności po uruchomieniu systemu, musisz dodać pliki do /etc/rc#.dkatalogu. Wpisy, które się tutaj pojawiają, informują system o kolejności i skryptach na poziomie /etc/init.duruchamiania. Liczba po rc wskazuje, na jakim poziomie pracy pracuje maszyna, zgodnie z tym wykresem:

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

Więc jeśli masz:

/etc/init.d/importantscript

Następnie potrzebujesz (pustych) plików:

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

S oznacza start, a K oznacza zabicie. Kiedy komputer się uruchomi, system powie „Ach, działam na RunLevel 3, przejdźmy do rc3.d, aby zobaczyć, jakie skrypty w '/etc/init.d' należy uruchomić i w jakiej kolejności.” W takim przypadku system posortuje według „S”, a następnie liczby po „S” i wykona „/etc/init.d/importantscript start”. 20 służy wyłącznie do zamawiania ... twój skrypt będzie działał za „S19” i przed „S21”. Możesz utworzyć te pliki, wykonując:

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

Oto także miłe podsumowanie: http://www.linux.com/news/enterprise/systems-management/8116-an-introduction-to-services-runlevels-and-rcd-scripts

aronchick
źródło
czy nie jest bardziej powszechne od „ln -s /etc/init.d/script” do rcX.d / *?
ozma
8

Nie musisz --- i nie powinieneś --- tworzyć plików /etc/rc.d/rcN.d/; Zamiast tego powinieneś dodać komentarz w czytaniu skryptu init

# chkconfig NNN A B

gdzie NNNjest zbiorem poziomów pracy, w której chcesz skrypt aktywny (np 345jeśli jest aktywny w trybach pracy 3, 4i 5) oraz Ai Bsą priorytety start i stop. Następnie chkconfig --add foo(zakładając, że skrypt ma nazwę foo) utworzy pliki /etc/rc.d/rcN.d/o odpowiednich nazwach.

Następnie można użyć service foo bar, aby wysłać barwiadomość do skryptu (na przykład start, stopcokolwiek - to gdzie $1pochodzi).

Piotr
źródło
0

$ 1 to argument wiersza poleceń, który jest przekazywany do twojego skryptu, to jeden z poleceń start, stop lub restart. W openSUSE nie pamiętam możliwości przekazywania innych argumentów do skryptu podczas korzystania z edytora runlevel, więc myślę, że to chyba jedyne, których powinieneś użyć.

Sam nie używam CentOS , ale wydaje się, że program do kontroli tego, co się uruchamia, na którym poziomie uruchamiania jest ntsysv .

Neal
źródło