Jak automatycznie uruchomić aplikację przy starcie


27

Jestem nowy w Linuksie i nie mogę się doczekać uruchomienia aplikacji (która przełącza diodę co 10 sekund). Napisałem program aplikacyjny i działa dobrze, ale teraz chcę go uruchomić automatycznie podczas rozruchu.

Dokumentacja tutaj mówi, aby skopiować skrypt startowy do /etc/init.dkatalogu i utworzyć symboliczne łącze do skopiowanego skryptu w rc.dkatalogu.

Jakie powinno być rozszerzenie i nazwa tych plików skryptów? Czy możemy ręcznie dodać łącze symboliczne rc.dlub czy istnieje w tym celu jakaś konkretna procedura?

Wszelkie sugestie, jak to osiągnąć?


Preferowany sposób dodawania skryptu inicjującego do uruchamiania zależy od dystrybucji. Niektórzy nawet wycofują je na korzyść upstart i systemd. Nie polecałbym po prostu używania „&” do tła, ponieważ coś takiego jak Debian start-stop-daemonradzi sobie z tym lepiej (chociaż lepiej, żeby sam program demonizował). Jakiej dystrybucji używasz? Poza typami MIME na pulpicie, rozszerzenia plików nie mają znaczenia w * nix i preferowane jest, aby pliki wykonywalne nie miały.
Jordan

Jeśli używasz petalogix, postępuj zgodnie z tą dokumentacją - nie są wymagane żadne specjalne nazwy, po prostu rób, co mówią. Próbowałeś? Jakie masz problemy? (Jeśli nie, podaj proszę swoją dystrybucję i wyjaśnij, co nie działa z tym, czego próbujesz.)
Mat.

Używam Debiana „wheezy” dla RPi.
wąwóz

1
jeśli musisz to robić mniej więcej co 10 sekund (tj. nie z dokładnością do 10 sekund), możesz cronzamiast tego użyć .
peterph

@peterph: ale wygląda na to, że program przełącza diodę co 10 sekund, a nie program, który jest wykonywany co 10 sekund.
Zorawar

Odpowiedzi:


19

Oto fragment strony http://www.debian-administration.org/articles/28, który wydaje się odpowiadać na twoje pytanie.

Uwaga: w poniższym przykładowym skrypcie wystarczy dodać wywołanie do sekcji „ start)”, aby faktycznie uruchomić program. Możesz przetestować funkcjonalność skryptu bez ponownego uruchamiania systemu: nazwij go pełną ścieżką i nadaj parametrowi „ start” lub „ stop

Tutaj idzie:

Debian używa systemu inicjującego Sys-V do wykonywania poleceń, gdy zmienia się poziom uruchamiania systemu - na przykład podczas uruchamiania i zamykania systemu.

Jeśli chcesz dodać nową usługę, która ma się uruchamiać podczas uruchamiania komputera, dodaj odpowiedni katalog do katalogu /etc/init.d/. Wiele skryptów już obecnych w tym katalogu daje przykład tego, co możesz zrobić.

Oto bardzo prosty skrypt, który jest podzielony na dwie części: kod, który zawsze działa, i kod, który działa, gdy jest wywoływany z „start” lub „stop”.

#! /bin/sh
# /etc/init.d/blah
#

# Some things that run always
touch /var/lock/blah

# Carry out specific functions when asked to by the system
case "$1" in
  start)
    echo "Starting script blah "
    echo "Could do more here"
    ;;
  stop)
    echo "Stopping script blah"
    echo "Could do more here"
    ;;
  *)
    echo "Usage: /etc/init.d/blah {start|stop}"
    exit 1
    ;;
esac

exit 0

Po zapisaniu pliku we właściwej lokalizacji upewnij się, że jest on wykonywalny, uruchamiając „ chmod 755 /etc/init.d/blah”.

Następnie musisz dodać odpowiednie dowiązania symboliczne, aby skrypt był wykonywany, gdy system zawiedzie lub się uruchomi.

Najprostszym sposobem na to jest użycie polecenia specyficznego dla Debiana update-rc.d:

root@skx:~# update-rc.d blah defaults
 Adding system startup for /etc/init.d/blah ...
   /etc/rc0.d/K20blah -> ../init.d/blah
   /etc/rc1.d/K20blah -> ../init.d/blah
   /etc/rc6.d/K20blah -> ../init.d/blah
   /etc/rc2.d/S20blah -> ../init.d/blah
   /etc/rc3.d/S20blah -> ../init.d/blah
   /etc/rc4.d/S20blah -> ../init.d/blah
   /etc/rc5.d/S20blah -> ../init.d/blah

czy muszę faktycznie umieścić ten skrypt w etc / init.d / czy czy wiersz u góry, # /etc/init.d/blah, wskazuje położenie powłoki?
user137717,

Dostaję komunikat „-sh: update-rc.d: nie znaleziono polecenia”
m4l490n

2
Nowsze systemy wykorzystują systemdwiele rzeczy, w tym konfigurację rozruchową. Służy systemctldo sterowania i konfiguracji systemd.
Alexander Shcheblikin

4

Najlepszym sposobem jest sprawdzenie źródła pakietu twojej dystrybucji dla regularnej usługi systemowej, np. Dla OpenSSH - zobaczysz jakie są dobre praktyki. W końcu jednym z powodów stojących za otwartym oprogramowaniem jest możliwość uczenia się ze źródeł.


2
Doskonała rada! Naprawdę mądry i odpowiedni i dostosowany do wszystkich Distos. (Nawiasem mówiąc, odpowiada na pytanie „nowość w Linuksie” i „jak to zrobić”.
Użyję

3

Użyj Supervisora, skutecznego programu, który zarządza i rejestruje aplikacje startowe z argumentami. Dowiedz się więcej na http://supervisord.org/running.html i (Postępuj zgodnie z instrukcją instalacji.

Utwórz plik conf na, /etc/supervisor/conf.d/{PROGRAM_NAME}.confa oto kod,

[program:{PROGRAM_NAME}]
command=/usr/bin/{PROGRAM_NAME} -arg1 -arg2
autostart=true  
autorestart=true  
stderr_logfile=/var/log/supervisor/{PROGRAM_NAME}.err.log  
stdout_logfile=/var/log/supervisor/{PROGRAM_NAME}.out.log  

Następnie wykonaj z linii cmd:

supervisorctl reload


Chociaż twoja odpowiedź jest w porządku, myślę, że powinieneś ją zmienić, aby pokazać, że „przeładowanie supervisorctl” ma zostać wykonane z interfejsu CLI, a nie do pliku
.conf

3

Korzystanie crontabjest znacznie łatwiejsze.

Służy crontab -edo edycji crontab użytkownika.
Dodaj następujący wiersz na końcu:

@reboot <command>

Przykłady:

  • @reboot my_script.sh
  • @reboot python my_script.py arg1 arg2

Na koniec użyj, crontab -laby upewnić się, że skrypt został dodany do listy.


Zastanawiam się, dlaczego ta odpowiedź została odebrana? Wydaje się, że jest to bardzo proste rozwiązanie, które wykorzystuje crontab - co prawdopodobnie wszyscy już znają i rozumieją.
kolinko

1

Nowsze wersje wsparcia dla systemu Linux systemd(jak powiedział @AlexanderShcheblikin). Ma więcej funkcji i jest bardziej przenośny niż rozwiązanie specyficzne dla Debiana.

Przeczytaj ten naprawdę świetny przewodnik .

Oto krótkie odniesienie do niezbędnego minimum :

  1. Skrypt (np. myscript.sh) Z uprawnieniami do wykonywania.
  2. Plik Unit (np. myservice.service) Z rozszerzeniem „.service” /etc/systemd/systemz uprawnieniami 644, zawierający polecenie wykonania skryptu. Na przykład,

:

[Unit]
Description=Example systemd service.

[Service]
Type=simple
ExecStart=/bin/bash /path/to/myscript.sh

[Install]
WantedBy=multi-user.target
  1. Uruchom polecenie, sudo systemctl enable myserviceaby umożliwić jego uruchomienie podczas rozruchu.
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.