Uruchamianie skryptu po zalogowaniu Mac [zamknięty]

280

Zastanawiam się, czy ktoś może mi pomóc w uruchomieniu pliku .sh, gdy loguję się na swoje konto na moim komputerze. Korzystam z systemu Mac OS X 10.6.7.

Mam plik „Example.sh”, który chcę uruchomić po zalogowaniu się na komputerze. Nie mam problemu z uruchomieniem go, gdy jestem już zalogowany, ale chcę, aby działało to automatycznie.

Ludzie mówią, aby dodać go do pliku powłoki logowania, ale nie wiem, gdzie to jest. Proszę o pomoc.

MZimmerman6
źródło
3
To nie jest temat ... Potrzebowałem go do uruchomienia demona Emacsa;) BTW najlepszą odpowiedzią jest IMHO aplikacja Lingon X.
HappyFace
1
Nie obchodzi mnie, czy to nie jest temat. To najlepsza odpowiedź, jaką znalazłem w Internecie i zasługuje na szacunek. Zignorowałem to dla innych, kiedy po raz pierwszy szukałem rozwiązania, i to był duży błąd!
Sethmr

Odpowiedzi:

379

Obserwuj to:

  • początek Automator.app
  • Wybierz Application
  • kliknij Show libraryna pasku narzędzi (jeśli ukryty)
  • dodaj Run shell script(z Actions/Utilities)
  • skopiuj i wklej swój skrypt do okna
  • Sprawdź to
  • zapisz gdzieś (na przykład możesz zrobić Applicationsfolder w swoim HOME, dostaniesz your_name.app)

  • przejdź do System Preferences-> Accounts->Login items

  • dodaj tę aplikację
  • test i gotowe;)

EDYTOWAĆ:

Niedawno zdobyłem znaczek „Dobra odpowiedź” dla tej odpowiedzi. Chociaż moje rozwiązanie jest proste i działa, najczystszy sposób na uruchomienie dowolnego programu lub skryptu powłoki podczas logowania opisano w odpowiedzi na @ trisweb , chyba że chcesz interaktywności .

Dzięki rozwiązaniu automatyzującemu możesz wykonywać następujące czynności: Aplikacja do logowania zrzutów ekranu automatora

więc, prosząc o uruchomienie skryptu lub zamknięcie aplikacji, pytając o hasła, uruchamiając inne przepływy pracy automatyzatora podczas logowania, warunkowo uruchamiaj aplikacje podczas logowania i tak dalej ...

jm666
źródło
2
@GregMiernicki LOL, dzień dobry ...;) Prawie rok temu dodał EDYT do mojej odpowiedzi, w którym to też powiedział. Jest to jednak nieco prostsze dla przeciętnych użytkowników, ponieważ tworzenie plików XML (plist) nie jest zbyt przyjazne dla wielu użytkowników. W każdym razie - dzięki za komentarz. ;)
jm666,
4
@GregMiernicki i nie zapominaj, że dzięki rozwiązaniu Automator możesz tworzyć INTERAKTYWNE skrypty logowania - np. Skrypt, który poprosi Cię o wpis (np. Dodatkowe hasło lub coś podobnego). Świat jest nie tylko czarny lub biały - przynajmniej jest jak zebra ... :) :)
jm666
2
@Cupidvogel Uruchamianie demona podczas logowania jest dokładnie zadaniem uruchomionego rozwiązania - patrz odpowiedź trisweb. Jeśli możesz zarządzać demonem python, na pewno możesz zarządzać plikiem konfiguracyjnym plist, w którym możesz zarządzać wszystkimi aspektami restartów i tak dalej ...
jm666
3
Wyrazy uznania za wskazanie drugiej odpowiedzi jako najczystszej. To powinno uzyskać dobrą odznakę obywatelską :).
studgeek
2
Niesamowita odpowiedź. Wykonaj eksport ŚCIEŻKI = / usr / local / bin: $ PATH, na początku skryptu, jeśli chcesz uruchamiać polecenia takie jak „globalna aktualizacja kompozytora” podczas uruchamiania systemu.
Leonardo
377

tl; dr: rodzimy proces launcher i OSX za pomocą Menedżera, launchd.

Aby to zrobić, stwórz launchctldemona. Będziesz mieć pełną kontrolę nad wszystkimi aspektami skryptu. Możesz uruchomić raz lub pozostać przy życiu jako demon. W większości przypadków jest to właściwy sposób.

  1. Utwórz .plistplik zgodnie z instrukcjami zawartymi w dokumentach Apple Dev tutaj lub bardziej szczegółowo poniżej.
  2. Umieścić w ~/Library/LaunchAgents
  3. Zaloguj się (lub uruchom ręcznie przez launchctl load [filename.plist])

Aby uzyskać więcej informacji launchd, artykuł w Wikipedii jest dość dobry i opisuje system oraz jego zalety w stosunku do innych starszych systemów.


Oto konkretny plik plist do uruchomienia skryptu podczas logowania .

Zaktualizowano 2017/09/25 dla OSX El Capitan i nowszych (podziękowania dla José Messiasa Jr ):

<?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>com.user.loginscript</string>
   <key>ProgramArguments</key>
   <array><string>/path/to/executable/script.sh</string></array>
   <key>RunAtLoad</key>
   <true/>
</dict>
</plist>

Zastąp <string>klucz programu po żądanym poleceniem (zwróć uwagę, że każdy skrypt, do którego odwołuje się to polecenie, musi być wykonywalny: chmod a+x /path/to/executable/script.shaby zapewnić, że jest dostępny dla wszystkich użytkowników).

Zapisz jako ~/Library/LaunchAgents/com.user.loginscript.plist

Uruchom launchctl load ~/Library/LaunchAgents/com.user.loginscript.plisti wyloguj się / zaloguj, aby przetestować (lub przetestować bezpośrednio, uruchomić launchctl start com.user.loginscript)

Ogon /var/log/system.logdla komunikatów o błędach.

Kluczem jest to, że jest to wpis uruchamiany specyficzny dla użytkownika, więc będzie uruchamiany przy logowaniu dla danego użytkownika. Demony uruchamiania specyficzne dla systemu (umieszczone w /Library/LaunchDaemons) są uruchamiane podczas rozruchu.

Jeśli chcesz, aby skrypt działał przy logowaniu dla wszystkich użytkowników, uważam, że LoginHook jest twoją jedyną opcją i prawdopodobnie dlatego istnieje.

trisweb
źródło
4
Tak. FWIW Uważam, że ten blog jest pomocny w tej samej technice: developernotes.com/archive/2011/04/06/169.aspx
Daniel James
8
Zlekceważysz wspomnienie, co jest wątpliwe w działaniach Automatora i dlaczego nie są one „zalecane”.
Mike Campbell
4
Oto dobry przegląd akcji folderów vs launchctl: apple.stackexchange.com/a/63731/38290 - I jeszcze jedno o ograniczeniach LoginHook (dozwolony jest tylko jeden skrypt) - superuser.com/a/377401 . To nie jest tak naprawdę wątpliwa lub zła metoda, ale launchctlw większości przypadków jest po prostu znacznie lepsza i daje większą kontrolę nad wszystkimi możliwymi aspektami uruchamiania skryptu. Chodzi raczej o to, „po co stosować mniej wydajną metodę, gdy istnieje uruchomienie?” (Uwaga: Zmieniłem pierwsze zdanie, aby wskazać, że osobiście nie polecam ich w tej sytuacji).
trisweb
3
Zastanawiasz się, jak utworzysz LaunchDaemon, co będzie działać za każdym razem, gdy użytkownik się zaloguje? . Tak więc nie podczas uruchamiania systemu, ale za każdym razem, gdy użytkownik loguje się (spróbuj w cyklu wylogowania-logowania). Czy możesz dokładnie pokazać (nie tylko bla-bla), jak zaimplementować powyższe (przez ciebie błędne) rozwiązanie automatyzacji za pomocą launchctl?
cajwine
9
Pliki list w / Library / LaunchAgents / są uruchamiane przy logowaniu z identyfikatorem zalogowanego użytkownika. Pliki list w / Library / LaunchDaemons / są uruchamiane podczas uruchamiania systemu jako root (identyfikator można zmienić za pomocą klucza użytkownika ).
bain
42
  1. Utwórz skrypt powłoki jak login.shw folderze $ HOME.

  2. Wklej następujący skrypt jednowierszowy do edytora skryptów:

    wykonaj skrypt powłoki „$ HOME / login.sh”

  3. Następnie zapisz go jako aplikację.

  4. Na koniec dodaj aplikację do swoich elementów logowania.

Jeśli chcesz, aby skrypt wyjściowy był wizualny, możesz zamienić krok 2 na to:

tell application "Terminal"
  activate
  do script "$HOME/login.sh"
end tell

Jeśli potrzebnych jest wiele poleceń, można użyć czegoś takiego:

tell application "Terminal"
  activate
  do script "cd $HOME"
  do script "./login.sh" in window 1
end tell
anubhava
źródło
1
sorin
1
Niezłe rozwiązanie. Jak mogę ukryć okno „logowania”? Próbowałem zaznaczyć elementy logowania.
xgdgsc
1
@xgdgsc: Idź Go to System Preferences -> Accounts -> Login itemsi zaznacz pole ukryj dla tej aplikacji.
anubhava
1
@anubhava Jak już powiedziałem, zaznaczyłem już pole ukrywania dla tej aplikacji logowania. Ale nadal się pojawia i trzeba go zamknąć przy wyłączaniu komputera.
xgdgsc,
2
@xgdgsc: Oh ok, sprawdziłeś ~/Library/LaunchAgentsfolder?
anubhava