Uruchom komendę podczas uruchamiania / logowania (Mac OS X)

53

Zastanawiałem się, w którym pliku powinienem umieścić to polecenie bash, aby zostało uruchomione podczas uruchamiania.

# Start the MongoDB server
/Applications/MongoDB/bin/mongod --dbpath /usr/local/mongo/data --fork --logpath /usr/local/mongo/log

I zostały szorowania netto i myślę, że jest pomiędzy ~/.bashrc, ~/profile, /etc/bashrc, /etc/profilelub ~/.bash_profile. Chociaż próbowałem tych i wydają się działać na starcie terminala, a nie na starcie Maca . Czy brakuje mi pliku?

Wolfy87
źródło

Odpowiedzi:

33

Oficjalnie żaden z nich. Sugerowanym przez Apple sposobem jest uruchomienie . Guis, aby to skonfigurować, to lingon i Launch Control

Jeśli chodzi o pliki, które wymieniasz, te z katalogu domowego ~ / .bashrc, ~ / profile, ~ / .bash_profile są uruchamiane tylko po zalogowaniu się przez terminal. Te w / etc są uruchamiane przez powłokę uruchamiającą się dla wszystkich użytkowników przed tymi w katalogu domowym, ale tylko po zalogowaniu się użytkownika. Bash manual

Skrypt startowy Uniksa dotyczył / etc / rc *, ale dla OSX wystarczy użyć uruchomionych rzeczy

użytkownik151019
źródło
1
Więc jeśli moje polecenie jest wstawione do któregoś z plików /etc, powinno być uruchamiane podczas uruchamiania? Czy to ważne, w jakim jest?
Wolfy87
1
/etc/bashrci tak dalej są uruchamiane przy uruchamianiu powłoki, tak jak ~/.bashrc- po prostu ta pierwsza będzie uruchamiana za każdym razem, gdy dowolny użytkownik uruchomi powłokę, a nie tylko użytkownik.
Scott
@ Scott jest poprawny Poprawiłem swoją odpowiedź
użytkownik151019
4
Okej, ale po prostu nie mogę pojąć, jak korzystać z uruchomionego programu, próbowałem utworzyć plik plist dla mojego programu, ale nie mam pojęcia, jak go uruchomić ani jak uruchomić go przy starcie systemu.
Wolfy87
1
@Mark link do „launchd” jest zepsuty :(
Artem
58

Aby uruchomić polecenie przy uruchamianiu w systemie OS X, musisz użyć launchd.

Jeśli nie chcesz korzystać z Lingon , musisz utworzyć listę launchdwłaściwości. Jest to plik XML, więc możesz to zrobić za pomocą swojego ulubionego edytora tekstów lub alternatywnie możesz użyć Edytora list właściwości, który jest zainstalowany z narzędziami programistycznymi Mac OS X. Utwórz następujące elementy:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>some.meaningful.name</string> <!-- org.mongodb.mongodb perhaps? -->

    <key>OnDemand</key>
    <false/>

    <key>UserName</key>
    <string>anAppropriateUser</string>

    <key>GroupName</key>
    <string>anAppropriateGroup</string>

    <key>ProgramArguments</key>
    <array>
            <string>/Applications/MongoDB/bin/mongod</string>
            <string>--dbpath</string>
            <string>/usr/local/mongo/data</string>
            <string>--fork</string>
            <string>--logpath</string>
            <string>/usr/local/mongo/log</string>
    </array>
</dict>
</plist>

Zapisz to w /Library/LaunchAgents/some.meaningful.name.plist(będziesz potrzebować konta administratora i / lub sudo), a następnie otwórz terminal i wykonaj:

sudo launchctl load /Library/LaunchAgents/some.meaningful.name.plist

Spowoduje to, że uruchomione zostanie załadować element, co spowoduje uruchomienie MongoDB podczas rozruchu. Jako bonus, launchdbędzie go monitorować, a jeśli wyjdzie z jakiegokolwiek powodu, zostanie ponownie uruchomiony. Aby pozbyć się przedmiotu, po prostu zastąp load w powyższym poleceniu unload.

Scott
źródło
1
Ta strona ( developer.apple.com/library/mac/documentation/Darwin/Reference/… ) zawiera listę wielu rzeczy, których uruchomienie przez uruchomienie nie powinno. Jeśli chcę uruchomić dowolne polecenie podczas uruchamiania, mogę nie mieć kontroli i polecenie może zakończyć się wykonywaniem tych czynności. Ponadto mogę nie chcieć, aby uruchamianie uruchomiło się ponownie, a element zatrzymał się, ponieważ jest to jednorazowy lub sam obsługuje ponowne uruchomienie. Co powinienem zrobić w tych przypadkach?
Michael,
@Scott, dziękuję. To najbardziej pomocna odpowiedź, jaką znalazłem w Internecie.
Dmitriy,
5
Spowoduje to próbę uruchomienia aplikacji co 10 sekund, co działa dobrze w przypadku usług, które nie umierają. Jeśli dotyczy to skryptu, który uruchamia się raz punktualnie (w moim przypadku wysyłanie wiadomości po uruchomieniu Slacka po ponownym uruchomieniu), dodaj <key>LaunchOnlyOnce</key><true/>do dykta.
msanford
Świetna uwaga, panie Sanford. uruchomienie, które się nie poddaje, tworzy ogromne pliki dziennika, które następnie spowalniają komputer Mac (z powodu ciągłego odczytu i zapisu tak dużych plików dziennika). Mogę użyć tej poprawki w niektórych źle napisanych programach komercyjnych działających na moim komputerze.
Foliovision,
1
Uwaga do siebie: jeśli potrzebujesz zmiennych środowiskowych: serverfault.com/questions/111391/…
Quandary
48

Kolejne proste rozwiązanie z przepełnienia stosu : Możesz:

  • Uruchom Automator.app;
  • Wybierz „Aplikacja”;
  • Kliknij „Pokaż bibliotekę” na pasku narzędzi (jeśli jest ukryty);
  • Dodaj „Uruchom skrypt powłoki” (z poziomu Działania / Narzędzia);
  • Skopiuj i wklej swój skrypt do okna;
  • Sprawdź to;
  • Zapisz go gdzieś: your_name.appzostanie utworzony plik o nazwie );
  • W zależności od wersji MacOSX:
    • Stare wersje: Przejdź do Preferencji systemowych → Konta → Elementy logowania lub
    • Nowa wersja: Przejdź do Preferencji systemowych → Użytkownicy i grupy → Elementy logowania (w prawym górnym rogu);
  • Dodaj tę nowo utworzoną aplikację;

Wyloguj się, zaloguj ponownie i powinieneś to zrobić. ;)

Jaime M.
źródło
2
Przetestowane i działa i nie wymaga uruchomionej uciążliwej edycji listy odtwarzania ani płatnej aplikacji Lingon.
Łukasz
4
Dodaje to jednak około 1804 tys. Płyt kotłowych do twojego trzywierszowego shellscript!
android.weasel
1
Dziękujemy za szczegółowe instrukcje na temat tworzenia czegoś przydatnego w Automatorze. Pomoże mi to nie tylko w jednym zadaniu. Dziękuję uprzejmie Jaime. Używam go, aby wyłączyć Turbo Boost za pomocą Turbo Boost Switcher. Mam wersję płatną, ale mechanizmy licencjonowania są wystarczająco okropne. Wolę korzystać z wersji bezpłatnej, która wymaga uruchomienia przez terminal, aby uniknąć żądania hasła administratora przy każdym przebudzeniu.
Foliovision,
1
@ android.weasel Zobacz odpowiedź Geekarist superuser.com/a/995564/255375
JD
Superuse-ful :-D, +1
Mukul Goel
28

Aby uruchomić polecenia podczas logowania, możesz to zrobić:

  • Utwórz plik tekstowy zawierający twoje polecenia (skrypt bash):

    #!/bin/bash
    
    # Start the MongoDB server
    /Applications/MongoDB/bin/mongod --dbpath /usr/local/mongo/data --fork --logpath /usr/local/mongo/log
    
  • Zapisz ten plik w ~/Library/Startup.cmd

  • Możesz to przetestować, klikając dwukrotnie plik w Finderze
  • Spraw, by był wykonywalny: chmod +x ~/Library/Startup.cmd
  • Dodaj ten plik w Preferencjach systemowych> Konta> Elementy logowania
Geekarysta
źródło
3
najlepsza i najłatwiejsza odpowiedź imho. znacznie łatwiejsze niż przyjęte rozwiązanie. zwróć uwagę, że jest w Preferencjach systemowych> Użytkownicy i grupy> Elementy logowania ... (nie Konta) ... a także pamiętaj, że plik może być w dowolnym miejscu, nie musi kończyć się na .cmd. po prostu chmod + x it.
foreyez
5
Jednak elementy logowania są uruchamiane przy logowaniu, a nie przy uruchomieniu systemu. Jeśli prowadzisz serwer, to duża różnica.
not2savvy 14.07.17
Masz rację @ not2savvy. Jako serwer polecam odpowiedź @ Sridhar-Sarnobat z @reboot. Jednak moja odpowiedź pozwoliłaby uruchomić program graficzny, dlatego uważam, że jest przydatny.
Geekarist
Dlaczego kończy się na cmdzamiast sh?
Simin Jie,
3

Będziesz musiał sprawdzić, jak launchdi launchctlpracować na MacOS. Możesz zacząć od przeczytania stron podręcznika dla obu poleceń. Następnie możesz zajrzeć do środka /Library/LaunchAgents/i zobaczyć /Library/LaunchDaemons/przykłady konfigurowania aplikacji do ładowania w różnym czasie przez launchctlinterfejs.

Oto przykład, który znalazłem na stosie przepełnienia, który może ci pomóc.

ayaz
źródło
0

Byłem zainteresowany bardzo prostą odpowiedzią uniksową na ten problem i znalazłem ją w innej witrynie . Oto podsumowanie rozwiązania.

Standardem dla powłok logowania jest zawsze szukanie plików konfiguracyjnych bash z „profil” w nazwie, w następującej kolejności: / etc / profile, ~ / .bash_profile, następnie ~ / .bash_login i wreszcie ~ / .profile. Kiedy powłoki logowania wychodzą, czytają ~ / .bash_logout.

W moim przypadku właśnie utworzyłem ~ / .bash_profile, a następnie otworzyłem preferencje dla aplikacji Mac Terminal i zmieniłem opcję „Powłoka otwiera się” z domyślnej na / bin / bash. Otóż ​​to. Czysty i prosty.

markgp
źródło
-3

otwórz terminal, wpisz

nano ~/.bash_profile

następnie dodaj ten tekst do pliku:

/Applications/MongoDB/bin/mongod --dbpath /usr/local/mongo/data --fork logpath /usr/local/mongo/log
MAX
źródło
3
Zakłada się, że otworzysz okno terminalu po zalogowaniu.
Arjan,