Jak uruchomić skrypt powłoki podczas uruchamiania

366

Na Amazon S3 przykład Linux, mam dwa skrypty nazywa start_my_appi stop_my_appktórego start i zatrzymanie na wieki (co z kolei prowadzi mój wniosek node.js). Używam tych skryptów do ręcznego uruchamiania i zatrzymywania aplikacji Node.js. Na razie w porządku.

Mój problem: chcę również skonfigurować go tak, aby start_my_appbył uruchamiany przy każdym uruchomieniu systemu. Wiem, że muszę dodać plik do wewnątrz init.di wiem, jak dowiązać go do odpowiedniego katalogu w nim zawartego rc.d, ale nie jestem w stanie dowiedzieć się, co faktycznie musi znaleźć się w pliku, w którym się umieszczam init.d. Myślę, że powinna to być tylko jedna linia start_my_app, ale to nie działało dla mnie.

meetamit
źródło
5
Nie jestem ekspertem w tego typu rzeczach, ale myślę, że init.drozwiązanie ( tutaj ) powinno być preferowane od rc.localrozwiązania, ponieważ to drugie jest starym oprzyrządowaniem, które wciąż jest użyteczne, ponieważ nowe oprzyrządowanie jest kompatybilne wstecz.
erikbwork
pm2 uruchom my_app; uruchomienie pm2; pm2 zapisz github.com/Unitech/pm2
Unitech

Odpowiedzi:

292

W pliku, który umieściłeś /etc/init.d/, musisz ustawić, aby był wykonywalny za pomocą:

chmod +x /etc/init.d/start_my_app

Dzięki @meetamit, jeśli to nie zadziała, musisz utworzyć dowiązanie symboliczne do /etc/rc.d/

ln -s /etc/init.d/start_my_app /etc/rc.d/

Pamiętaj, że w najnowszym Debianie nie będzie to działało, ponieważ twój skrypt musi być zgodny z LSB (zapewnij przynajmniej następujące działania: start, stop, restart, wymuszenie przeładowania i status): https: //wiki.debian .org / LSBInitScripts

Uwaga: zamiast ścieżki względnej należy podać bezwzględną ścieżkę skryptu, ponieważ może to rozwiązać nieoczekiwane problemy:

/var/myscripts/start_my_app

I nie zapomnij dodać na górze tego pliku:

#!/bin/sh
Jonathan Muller
źródło
6
Zrobiłem to i nie zadziałało. czy będzie działał automatycznie tylko dlatego, że znajduje się w /etc/init.d, czy też muszę zrobić coś na wierzchu, aby zaplanować jego uruchomienie podczas uruchamiania systemu?
amfibia
4
@amphibient Niezupełnie ... Musisz także utworzyć dowiązanie symboliczne do tego pliku (za pomocą lnpolecenia) do katalogu wewnątrzrc.d
meetamit
23
nie ma katalogu rc.d w folderze itp. mojego katalogu głównego .. to mnie ogłupiało, czy to nie jest kluczowy katalog, który Linux musi uruchomić? Po prostu brakuje, a mój system operacyjny wydaje się działać dobrze. Czy muszę to stworzyć? Widzę kilka plików o podobnych nazwach, takich jak „rc1.d” aż do „rc5.d”
OKGimmeMoney
3
Nie mam żadnego /etc/rc.dfolderu, ale mam /etc/rcX.dfoldery (np. /Etc/rc0.d , /etc/rc1.d , /etc/rcS.d ), jest też plik /etc/rc.local . Myślę, że powinieneś utworzyć dowiązania symboliczne w folderze niestandardowym, takim jak /etc/rc9.dlub w jednym z istniejących ... (Ubuntu Server 14.04)
F8ER
2
To pytanie pomogło mi w tym: unix.stackexchange.com/questions/28679/…
seth10
343

Ustaw crontab do tego

#crontab -e
@reboot  /home/user/test.sh

po każdym uruchomieniu uruchomi skrypt testowy.

Hemant Kumar
źródło
4
To jedyne rozwiązanie, które dla mnie zadziałało bezproblemowo! dziękuję
whoopididoo,
20
To najlepsze rozwiązanie, @reboot sh $HOME/test.shw crontab jest jeszcze czystsze
3667089
4
@ user3667089 faktycznie nie działa. Otwieram terminal, wpisuję „crontab -e”, pojawia się okno, w którym piszę w „@reboot sh /home/user/test.sh”, ale nie działa przy starcie. Gdzie robię to źle?
MycrofD
@ user3667089 zwykłe domyślne wiersze „# Edytuj ten plik do ...”, a następnie wiersz, który napisałem „@reboot sh /home/.../.sh”. Próbowałem też „@reboot /home/.../.sh” bez początkowego „sh”, ale bez rezultatów.
MycrofD
3
@MycrofD crontab -lpowinieneś pokazać, @reboot sh $HOME/test.shaby potwierdzić, że jest rzeczywiście ustawiony.
user3667089,
124

Prostym podejściem jest dodanie linii w /etc/rc.local:

/PATH/TO/MY_APP &

lub jeśli chcesz uruchomić polecenie jako użytkownik specjalny:

su - USER_FOOBAR -c /PATH/TO/MY_APP &

(końcowe znaki handlowe i tło procesują i pozwala rc.local kontynuować wykonywanie)

Jeśli potrzebujesz pełnego skryptu inicjującego, dystrybucja debian ma plik szablonu, więc:

cp /etc/init.d/skeleton /etc/init.d/your_app

i trochę to dostosujcie.

Gilles Quenot
źródło
2
Dzięki! To podejście okazało się najlepsze, biorąc pod uwagę proste wymagania. Jestem prawie pewien, że MUSISZ określić użytkownika, w przeciwnym razie stop_my_appgdybym musiał ręcznie zatrzymać aplikację (przez uruchomienie ), musiałbym to zrobić sudo, prawda? Zastanawiam się także, jaka dokładnie jest funkcja końcowego znaku handlowego (?).
meetamit
3
Użytkownik zależy od Twojej aplikacji. Ale jeśli nie jest to absolutnie potrzebne do działania jako root, unikaj go. &uruchom proces w tle
Gilles Quenot
2
sputnick, przepraszam, ale muszę zaznaczyć odpowiedź Korena, głównie z powodu tego, na co wskazał @ erikb85, ale także dlatego, że moje pierwotne pytanie dotyczyło init.dsposobu robienia rzeczy (wtedy wasza odpowiedź była dla mnie tylko prostszym obejściem) . Ten post zyskuje wiele wyświetleń i głosów, dlatego ważne jest, aby zachować dokładność.
meetamit
4
Wydaje się, że nie wspominano, że końcowe znaki handlowe i tło procesują i pozwala rc.local kontynuować wykonywanie.
mchicago
Dzięki za to! Spędzam kilka ostatnich godzin uderzając głową o ścianę, kiedy próbuję zrobić usługę, ale nic nie działa. Próbowałem tego, działa jak urok!
Marko Grešak
34

Tak właśnie robię w systemach Red Hat Linux .

Umieść skrypt w /etc/init.dposiadaniu roota i pliku wykonywalnego. Na górze skryptu możesz podać dyrektywę dla chkconfig. Przykład: poniższy skrypt służy do uruchomienia aplikacji Java jako wyrocznia użytkownika.

Nazwa skryptu to /etc/init.d/apex

#!/bin/bash
# chkconfig: 345 99 10
# Description: auto start apex listener
#
case "$1" in
 'start')
   su - oracle -c "cd /opt/apex ; java -jar apex.war > logs/apex.log 2>logs/apex_error.log &";;
 'stop')
   echo "put something to shutdown or kill the process here";;
esac

Oznacza to, że skrypt musi działać na poziomach 3, 4 i 5, a priorytet dla start / stop to 99 i 10.

Następnie jako użytkownik rootmożesz użyć chkconfigdo włączenia lub wyłączenia skryptu podczas uruchamiania:

chkconfig --list apex
chkconfig --add apex

I możesz użyć service start/stop apex.

Saule
źródło
W międzyczasie eksperymentowałem z pakietem o nazwie supervisord ( supervisord.org ), który jest dostępny w repozytorium epel. Można go używać do uruchamiania programów i monitorowania ich, restartowania w przypadku awarii.
Saule,
Zamiast pisać: „chkconfig --add nazwa_usługi” po umieszczeniu skryptu w folderze /etc/init.d/ możesz wpisać: „chkconfig nazwa_usługi”
Dragan Radevic
21

Wprowadź cronza pomocą sudo:

sudo crontab -e

Dodaj polecenie, które zostanie uruchomione podczas uruchamiania, w tym przypadku skrypt:

@reboot sh /home/user/test.sh

Zapisać:

Naciśnij ESC, a następnie: x, aby zapisać i wyjść, lub naciśnij ESC, a następnie ZZ (to shift + ZZ)

Test Test Test :

  1. Uruchom skrypt testowy bez crona, aby upewnić się, że rzeczywiście działa.

  2. Upewnij się, że zapisałeś swoje polecenie w cron, użyj sudo crontab -e

  3. Uruchom ponownie serwer, aby potwierdzić, że wszystko działa sudo @reboot

użytkownik3140639
źródło
Bardzo to lubię. Dzięki! Ps. nie używaj, sudojeśli chcesz uruchomić określone polecenie podczas uruchamiania przy użyciu bieżącego użytkownika.
niebezpieczne89
Gdzie te informacje powinny być przechowywane? Nie w /tmp??
Peter Mortensen
15

Po prostu dodaj linię do swojego crontab ..

Upewnij się, że plik jest wykonywalny:

chmod +x /path_to_you_file/your_file

Aby edytować plik crontab:

crontab -e

Linia, którą musisz dodać:

@reboot  /path_to_you_file/your_file

Tak proste!

Luciano Ghilarducci
źródło
To mi nie działa, brakuje mi czegoś? # uname -a Linux accton-xp70a0-26-a1 3.11.10-301.fc20.x86_64 #1 SMP Thu Dec 5 14:01:17 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
Działa to dla mnie w CentOs 7. Dla tych, którzy mieli problemy, musiałem utworzyć skrypt powłoki, uczynić go wykonywalnym (chmod + x nazwa_pliku) i wywołać skrypt powłoki z crona, który z kolei wywołuje węzeł ścieżka_do_pliku / index.js
SeanOlson
11

Inną opcją jest posiadanie polecenia @reboot w twoim crontabie.

Nie każda wersja crona obsługuje to, ale jeśli twoja instancja oparta jest na Amazon Linux AMI, to będzie działać.

Chris
źródło
6

Możesz to zrobić :

chmod +x PATH_TO_YOUR_SCRIPT/start_my_app 

następnie użyj tego polecenia

update-rc.d start_my_app defaults 100

Proszę zobaczyć tę stronę na Cyberciti .

IR PRO
źródło
1
Mam całkiem nieuzbrojoną konfigurację, zbudowaną na Yocto, i to był jedyny sposób, aby mój skrypt działał. Dzięki.
Catalin Vasile
3

Utwórz własny plik wykonywalny / init

Nie tego chcesz, ale jest fajnie!

Po prostu wybierz dowolny plik wykonywalny, nawet skrypt powłoki i uruchom jądro z parametrem wiersza poleceń:

init=/path/to/myinit

Pod koniec rozruchu jądro Linux uruchamia pierwszy plik wykonywalny przestrzeni użytkownika na podanej ścieżce.

Popularnych jest kilka projektów init pliki wykonywalne używane przez główne dystrybucje, np. Systemd, aw większości dystrybucji init rozwinie wiele procesów wykorzystywanych podczas normalnej pracy systemu.

Ale możemy przejąć kontrolę /init , aby uruchomić własne minimalne skrypty, aby lepiej zrozumieć nasz system.

Oto minimalna odtwarzalna konfiguracja: https://github.com/cirosantilli/linux-kernel-module-cheat/tree/f96d4d55c9caa7c0862991025e1291c48c33e3d9/README.md#custom-init

Ciro Santilli
źródło
2

To proste rozwiązanie działało dla mnie na instancji Amazon Linux z systemem CentOS. Edytuj /etc/rc.d/rc.localplik i umieść tam polecenie. W tym pliku wspomniano, że zostanie on wykonany po wszystkich innych skryptach inicjujących. W związku z tym bądź ostrożny. Tak wygląda obecnie plik. wprowadź opis zdjęcia tutaj. Ostatnia linia to nazwa mojego skryptu.

shshnk
źródło
1

Absolutnie najłatwiejszą metodą, jeśli wszystko, co chcesz uruchomić, jest prosty skrypt (lub cokolwiek innego), jeśli masz GUI do korzystania z preferencji systemowych>, a następnie uruchamiania aplikacji.

po prostu przejdź do odpowiedniego skryptu i gotowe. (uczyń skrypt wykonywalnym)

Fieldweeper
źródło
3
To nie działa właściwie przy starcie, ale przy logowaniu, co jest dość dużą różnicą. Zależy to również od określonej konfiguracji, ponieważ nie będziesz mieć opcji „System> Preferencje” na każdym systemie (szczególnie na serwerach).
jazzpi
wyszukiwane hasło „linux execute at startup” doprowadziło mnie do tej odpowiedzi, której szukałem. Mimo że nie odpowiada na pytanie OP, może to pomóc w Linuksie (ubuntu) noobom takim jak ja, więc zasługuje na pozytywną opinię. Też mi się nie podoba, ale to pragmatyzm.
thymaro
1

W przypadku Debiana 9 patrz /ubuntu/228304/how-do-i-run-a-script-at-start-up . Pomogło mi to. Krótka wersja dla Debian 9: dodaj komendy (jako root) do /etc/rc.local

/path_to_file/filename.sh ||  exit 1   # Added by me
exit 0

Prawdopodobnie plik /path_to_file/filename.sh powinien być wykonywalny (tak mi się wydaje).

Michaił Ionkin
źródło
1

W Lubuntu miałem do czynienia z odwrotną sytuacją. Skype zaczyna działać po uruchomieniu i znalazłem w ~/.config/autostart/pliku skypeforlinux.desktop. Zawartość pliku jest następująca:

[Desktop Entry]
Name=Skype for Linux
Comment=Skype Internet Telephony
Exec=/usr/bin/skypeforlinux
Icon=skypeforlinux
Terminal=false
Type=Application
StartupNotify=false
X-GNOME-Autostart-enabled=true

Usunięcie tego pliku pomogło mi.

aerijman
źródło
0
  • Dodaj swój skrypt do katalogu /etc/init.d/
  • Zaktualizuj poziomy uruchomieniowe rc: $ update-rc.d myScript.sh defaults NNgdzie NN to kolejność, w jakiej powinien zostać wykonany. Na przykład 99 oznacza, że ​​będzie uruchamiany po 98, a przed 100.
Kibrom Gebre
źródło
0

Praca z mikrousługami lub powłoką Python 3; używając Ubuntu Server 18.04 (Bionic Beaver) lub Ubuntu 19.10 (Eoan Ermine) lub Ubuntu 18.10 (Cosmic Cuttlefish) Zawsze lubię te kroki i zawsze działało :

  1. Tworzenie mikrousługi o nazwie p przykład „brain_microservice1.service” w moim przypadku:

    $ nano /lib/systemd/system/brain_microservice1.service
  2. Wewnątrz tej nowej usługi, w której jesteś:

    [Unit]
    Description=brain_microservice_1
    After=multi-user.target
    
    [Service]
    Type=simple
    ExecStart=/usr/bin/python3.7 /root/scriptsPython/RUN_SERVICES/microservices    /microservice_1.py -k start -DFOREGROUND
    ExecStop=/usr/bin/python3.7 /root/scriptsPython/RUN_SERVICES/microservices/microservice_1.py -k graceful-stop
    ExecReload=/usr/bin/python3.7 /root/scriptsPython/RUN_SERVICES/microservices/microservice_1.py -k graceful
    PrivateTmp=true
    LimitNOFILE=infinity
    KillMode=mixed
    Restart=on-failure
    RestartSec=5s
    
    [Install]
    WantedBy=multi-user.target
  3. Daj uprawnienia:

    $ chmod -X /lib/systemd/system/brain_microservice*
    $ chmod -R 775 /lib/systemd/system/brain_microservice*
  4. Daj następnie pozwolenie na wykonanie:

    $ systemctl daemon-reload
  5. Włącz wtedy, to spowoduje, że zawsze zacznie się przy starcie

    $ systemctl enable brain_microservice1.service
  6. Następnie możesz to przetestować;

    $ sudo uruchom ponownie teraz

  7. Zakończ = SUKCES !!

Można to zrobić za pomocą tego samego skryptu ciała, aby uruchomić powłokę, zareagować ... skrypt uruchamiania bazy danych ... dowolny kod systemu operacyjnego ... mam nadzieję, że ta pomoc ...

...

Renan Moura
źródło
0

Oto prostsza metoda!

Po pierwsze: napisz skrypt powłoki i zapisz go .sh tutaj jest przykładem

#!/bin/bash
Icoff='/home/akbar/keyboardONOFF/icon/Dt6hQ.png'
id=13
fconfig=".keyboard"
echo "disabled" > $fconfig
xinput float $id
notify-send -i $Icoff "Internal Keyboard disabled";

ten skrypt wyłączy wewnętrzną klawiaturę podczas uruchamiania.

Po drugie: otwórz aplikację „Preferencje uruchamiania aplikacji”

wprowadź opis zdjęcia tutaj

wprowadź opis zdjęcia tutaj

Po trzecie: kliknij Dodaj. po czwarte: w sekcji NAZWA podaj nazwę. po piąte: w sekcji poleceń przejdź do swojego .sh. po szóste: edytuj sekcję poleceń, aby:

bash <space> path/to/file/<filename>.sh <space> --start

po siódme: kliknij Dodaj. Otóż ​​to! Skończone!

Teraz potwierdź, uruchamiając ponownie komputer.

Twoje zdrowie!

akbar ali
źródło
-1

Bezbolesną, najłatwiejszą i najbardziej uniwersalną metodą jest po prostu wykonanie jej za pomocą ~.bash_profilelub ~.profile (jeśli nie masz pliku bash_profile) .

Wystarczy dodać polecenie wykonania na dole tego pliku, a zostanie ono uruchomione po uruchomieniu systemu.

Mam ten na dole przykład; ~\Desktop\sound_fixer.sh

Juko
źródło
2
To niedokładne. ~/.bash_profilewykonuje się, gdy użytkownik się loguje - nie podczas uruchamiania systemu. W pierwotnym pytaniu chodzi o uruchomienie serwera aplikacji Node.js podczas uruchamiania komputera. Twoje rozwiązanie wymagałoby od człowieka zalogowania się do komputera przed uruchomieniem serwera Node.js. A jeśli jakiś problem spowoduje ponowne uruchomienie serwera z dnia na dzień, aplikacja nigdy nie wróci do życia, dopóki człowiek się nie zaloguje.
meetamit
-6

W przypadku niektórych osób będzie to działać:

Możesz po prostu dodać następujące polecenie do SystemuPreferencjeAplikacje startowe :

bash /full/path/to/your/script.sh
SagarSave
źródło
Nie widzę tego w menu preferencji systemowych. Ale widzę to podczas wyszukiwania w programie uruchamiającym aplikacje.
OKGimmeMoney
To nie działa właściwie przy starcie, ale przy logowaniu, co jest dość dużą różnicą. Zależy to również od określonej konfiguracji, ponieważ nie będziesz mieć opcji „System> Preferencje” na każdym systemie (szczególnie na serwerach).
jazzpi,
3
Ta odpowiedź wydaje się bardziej dotyczy komputera Ubuntu / Linux, ale użytkownik faktycznie prosi o pomoc dla instancji AWS EC2 Linux, która, o ile mi wiadomo, nie ma graficznego interfejsu użytkownika.
Vini.g.fer