Jak mogę zrobić skrypt w /etc/init.d uruchamiany przy starcie systemu?

83

Myślę, że już coś o tym czytałem, ale nie pamiętam, jak to się robi. Zasadniczo mam usługę, w /etc/init.dktórej chciałbym uruchomić się automatycznie podczas rozruchu. Pamiętam, że ma to coś wspólnego z symlinkowaniem skryptu do /etc/rc.dkatalogu, ale obecnie nie pamiętam. Jakie jest na to polecenie?

Wierzę, że jestem na pochodnej Fedory / CentOS.

Naftuli Kay
źródło
To zależy od twojego systemu operacyjnego. Jaki wariant unixa używasz, a jeśli Linux, jaką dystrybucję? Które spośród /etc/init, /etc/init.d, /etc/rc.d, /etc/rc.locali kilka innych to ma?
Gilles
1
Myślę, że jestem na CentOS lub coś w tym stylu. Czy odpowiedź byłaby inna w przypadku Debiana? Interesuje mnie również rozwiązanie dla Debiana.
Naftuli Kay,

Odpowiedzi:

109

Jeśli korzystasz z systemu opartego na systemie Red Hat, jak wspomniałeś, możesz wykonać następujące czynności:

  1. Utwórz skrypt i umieść w /etc/init.d(np /etc/init.d/myscript.). Skrypt powinien mieć następujący format:
#!/bin/bash
# chkconfig: 2345 20 80
# description: Description comes here....

# Source function library.
. /etc/init.d/functions

start() {
    # code to start app comes here 
    # example: daemon program_name &
}

stop() {
    # code to stop app comes here 
    # example: killproc program_name
}

case "$1" in 
    start)
       start
       ;;
    stop)
       stop
       ;;
    restart)
       stop
       start
       ;;
    status)
       # code to check status of app comes here 
       # example: status program_name
       ;;
    *)
       echo "Usage: $0 {start|stop|status|restart}"
esac

exit 0 

Format jest dość standardowy i możesz przeglądać istniejące skrypty w /etc/init.d. Następnie możesz użyć skryptu tak /etc/init.d/myscript startlub chkconfig myscript start. ckconfigStrona podręcznika wyjaśnia nagłówka skryptu:

 > This says that the script should be started in levels 2,  3,  4, and
 > 5, that its start priority should be 20, and that its stop priority
 > should be 80.

Przykładowy kod start, stop i status wykorzystuje funkcje pomocnicze zdefiniowane w /etc/init.d/functions

  1. Włącz skrypt

    $ chkconfig --add myscript 
    $ chkconfig --level 2345 myscript on 
    
  2. Sprawdź, czy skrypt jest rzeczywiście włączony - powinieneś zobaczyć „on” dla wybranych poziomów.

    $ chkconfig --list | grep myscript
    
Canen
źródło
3
Chkconfig jest tym, czego chcesz. +1
whoami
Dlaczego init zaczął coś na poziomach 2, 3, 4 i 5? Czy nie musisz uważać, aby nie uruchomić serwera na poziomie 2? I tak zresztą poziom pracy 4 nie jest zdefiniowany w RHEL, więc po co próbować uruchomić go na tym poziomie pracy? Nie krytyka, tylko chcę wiedzieć. Jestem rodzimym użytkownikiem Slackware.
Bruce Ediger,
4 nie jest zdefiniowane w RHEL, ale istnieje. Możesz go ukraść dla własnych rzeczy.
Kevin M,
Nagłówek pochodzi ze strony man chkconfig. W większości przypadków osobiście trzymam się 235 lub tylko 35.
canen,
Czy jest dziennik, który mogę sprawdzić, jeśli coś się nie uruchomi podczas uruchamiania?
Utkarsh Sinha
10

Testujesz, na jakim poziomie uruchomieniowym normalnie zaczyna się Twoja maszyna.

runlevel

Często jest to 5 lub 2 - istnieją różne konwencje, ale tak naprawdę nic nie ustalono, afaik. Ubuntu używa 2, podczas gdy poprzednia dystrybucja, z której korzystałem, zawsze była używana

  • 1 pojedynczy użytkownik (superużytkownik)
  • 2 wielu użytkowników
  • 3 wielu użytkowników + sieć
  • 4 nieużywane / definiowane przez użytkownika
  • 5 wielu użytkowników, sieć + X11

Następnie tworzysz dowiązanie symboliczne ze skryptu inicjującego, może /etc/init.d/foobardo/etc/rc2.d/SXYfoobar

S oznacza „Uruchom ten skrypt na tym poziomie działania (tutaj: 2). XY jest dwucyfrową liczbą dziesiętną, która jest istotna dla sekwencji, skrypty są uruchamiane.

Jeśli zależysz od skryptu S45barfoo, który ma zostać uruchomiony przed Tobą, a S55foofoo zależy od skryptu, wybierz xy między 45 a 55. Dla równych liczb kolejność rozruchu jest niezdefiniowana.

Tymczasem Ubuntu przełączył się na inną procedurę uruchamiania, zwaną upstart.

I uwaga: nie zawsze linki prowadzą do /etc/rcX.d- czasem jest /etc/init/rcX.dlub coś podobnego, ale powinno być łatwe do znalezienia, gdzieś poniżej / etc.

Jeśli chcesz uruchomić coś na końcu skryptów startowych, /etc/rc.localznajdź plik, którego szukasz, ale jeśli zależy to od X11 już uruchomionego, możesz poszukać opcji autostartu środowiska pulpitu lub /etc/X11/Xsession.d/z podobnym wzorcem jak opisano powyżej.

Jeśli zależysz od działającej sieci, istnieje osobny katalog (if-up.d) i dla podłączonych urządzeń, takich jak zewnętrzne napędy USB /etc/udev/rules.d/.

nieznany użytkownik
źródło
Czy nie ma dla ciebie polecenia, które symbolizuje dowiązanie symboliczne? Myślałem, że pamiętam coś takiego.
Naftuli Kay,
1
Prawda update-rc.d?
Naftuli Kay
GUI czy wiersz poleceń? Twój DE może dostarczyć narzędzie do oznaczania poziomów uruchamiania, od którego można rozpocząć lub zatrzymać skrypt. Widziałem coś takiego, ale nie pamiętam nazwy i jak określić liczbę (xy).
użytkownik nieznany
Wiersz poleceń. Obsługuje dla ciebie symlinkowanie i pozwala przełączać przełączniki na to, czy niektóre skrypty działają, czy nie.
Naftuli Kay,
3

Jak Naftuli Tzvi Kay pytał o Debiana powyżej: Począwszy od Debiana 6, twój skrypt powinien zawierać nagłówek LSB (Linux Standards Base), który wskazuje na jego zależności i możliwości ( patrz strona wiki Debiana ).

Jeśli obecny jest nagłówek LSB, możesz użyć go insservdo włączenia skryptu w proces rozruchu ( zobacz inną stronę wiki Debiana ).

MDT
źródło