Jak zapobiec niepożądanemu zamykaniu aplikacji uruchomionej w Terminalu?

10

Uruchamiam aplikacje z terminala za pomocą takich poleceń:

/Applications/Mail.app/Contents/MacOS/Mail &

Ważną częścią jest  &.

  • W systemach Unix / Linux / Solaris:

    • Nauczyłem się w szkole, że dodanie  &programów sprawia, że ​​program działa na własną rękę.
    • Zdecydowanie pamiętam uruchomienie polecenia podobnego  xeyes &do tego, aby program działał bezpiecznie nawet po zamknięciu powłoki.
  • W systemie Mac OS X (wewnątrz systemu Unix):

    1. Uruchamiam aplikację za pomocą  &i zamykam okno Terminal: aplikacja wychodzi!
    2. Dlaczego takie niepożądane zachowanie występuje w systemie Mac OS X?
    3. Jak to może zostać naprawione ?
Nicolas Barbulesco
źródło
Powiązane pytanie: apple.stackexchange.com/q/119319/20773
Eric3

Odpowiedzi:

7

„Standardowym” sposobem osiągnięcia tego, co chcesz osiągnąć (w OS X, a także w Linuksie, FreeBSD lub innych systemach) jest użycie polecenia nohup:

nohup program &

To się uruchomi program, które będzie działać w tle względem powłoki z powodu &- i zignoruje sygnały zawieszenia z powodu polecenia nohup.

W ten sposób program będzie kontynuował działanie nawet po zamknięciu powłoki. Nie ma znaczenia, czy zamykasz powłokę, ponieważ zamykasz Terminal.app, czy zamykasz powłokę, ponieważ rozłączasz się z połączeniem ssh z komputerem lub podobnym.

jksoegaard
źródło
1
Spowoduje to utworzenie pliku nohup.outw bieżącym folderze. Nawet gdy nie ma nic do napisania. Po kilku tygodniach będę mieć pliki na nohup.outcałym komputerze Mac. :-(
Nicolas Barbulesco
1
@NicolasBarbulesco Użyj albo nohup command>/dev/null&lub command&disown.
Lri
6

Po zamknięciu okna terminala wysyła SIGHUP (sygnał rozłączenia) do powłoki, który następnie przesyła SIGHUP do wszystkich uruchomionych procesów . Jest to tradycyjne zachowanie bash i wielu innych powłok, a tradycyjnym rozwiązaniem jest użycie nohup.

Istnieją różne sposoby, w których różne maszyny uniksowe mogą się różnić, więc możliwe jest, że określone emulatory terminali lub używane powłoki były różne. Ale nie jest to specyficzne dla OS X. Na przykład w Ubuntu istnieje pytanie dotyczące tego samego problemu.

Alan Shutko
źródło
6

Używając znaku „ &” i „ ”, mówisz Terminalowi, aby uruchomił proces w tle samej powłoki. Dlatego po zamknięciu powłoki (i zabiciu procesu) GUI (sama aplikacja Mail.app) również się zamknie.

Prawidłowe polecenie uruchomienia poczty z terminala to po prostu:

open -a Mail; exit

Edycja: Właśnie to znalazłem na U&L Stack Exchange: Co oznacza ampersand na końcu linii skryptu powłoki? Odpowiedzi są doskonałe i dokładnie wyjaśniają, co się dzieje bardziej szczegółowo i lepiej niż kiedykolwiek mogłem! Bardzo polecam przeczytanie go.

njboot
źródło
Co z przekazywaniem parametrów wiersza polecenia do aplikacji? W ten sposób:/Users/nicolas/Desktop/Firefox-29-fr/Firefox.app/Contents/MacOS/firefox -profile "/Users/nicolas/Desktop/Firefox-29-fr/Profil-Firefox-29-fr/" -no-remote &
Nicolas Barbulesco
2
@NicolasBarbulesco To jest osobne pytanie - otwórz stronę podręcznika dla otwartych i myślę, że tutaj pytanie
użytkownik151019
Co z uruchomieniem konkretnej aplikacji, nie będąc w /Applications, ale na określonej ścieżce? W ten sposób:/Users/nicolas/Desktop/Firefox-29-fr/Firefox.app/Contents/MacOS/firefox -profile "/Users/nicolas/Desktop/Firefox-29-fr/Profil-Firefox-29-fr/" -no-remote &
Nicolas Barbulesco
@NicolasBarbulesco otwórz [pełna ścieżka] lub cd do katalogu i otwórz [plik]. Możesz użyć ~ / dla swojego folderu domowego i znaku specjalnego, „gwiazdki”, jako krótszej notacji zakładającej, że żadne inne ciągi nie pasują do wartości, np .: ~ / De * / Fire * ... i tak dalej. Lub po prostu napisz prosty skrypt: cat> nameofscript ..... #! / bin / sh .... otwórz [pełna ścieżka] .... ^ D ..... chmod + x nameofscript ...... \ nameofscript .... i opcjonalnie mv nameofscript $ PATH / yourpersonalbin. Polecam czytanie człowieka otwartego. To proste polecenie, a jako proste polecenie kompromis nie jest tak potężny.
njboot
1
Niestety, nadal muszę użyć argumentu -a:open -a Applications/Mail.app/Contents/MacOS/Mail; exit
njboot
4

Znalazłem rozwiązanie:

(/Applications/Mail.app/Contents/MacOS/Mail &)

To proste, ładne i działa!

Nawiasy  ( )uruchamiają polecenie w podpowłoce.

Nicolas Barbulesco
źródło
- i znaki & wracają z programu do powłoki bez czekania, dzięki czemu możesz nadal używać powłoki lub zakończyć ją, bez uruchamiania programu.
r_alex_hall
3

@jksoegaard ma odpowiednie polecenia, ale jak wspomniano w komentarzu, tworzy plik nohup.out. Aby zatrzymać tworzenie pliku nohup.out, musisz przekierować STDOUT i STDERR w inne miejsce. Kompletne polecenie byłoby nohup program &>/dev/null &. Spowoduje to uruchomienie programu w tle, ignorowanie SIGHUP i wysyłanie wszystkich STDOUT i STDERR do / dev / null.

Jeśli jednak nie pamiętasz dodania nohup (jak w oryginalnym pytaniu), możesz użyć disown -arhpolecenia, aby oznaczyć wszystkie uruchomione zadania w tle, aby zignorować SIGHUP.

Oprogramowanie Insomniac
źródło
Ładna odpowiedź, ale wciąż skomplikowana. I ładne zdjęcie profilowe. :-)
Nicolas Barbulesco
0

Lub możesz spróbować open -a /Applications/Mail.app

Sposób użycia: otwórz [-e] [-t] [-f] [-W] [-R] [-n] [-g] [-h] [-s] [- b] [-a] [nazwy plików] [--args argumenty]
Pomoc: Otwórz otwiera pliki z powłoki.
      Domyślnie otwiera każdy plik przy użyciu domyślnej aplikacji dla tego pliku.
      Jeśli plik ma postać adresu URL, plik zostanie otwarty jako adres URL.
Opcje:
      -a Otwiera się z określoną aplikacją.
      -b Otwiera się z określonym identyfikatorem pakietu aplikacji.
      -e Otwiera się za pomocą TextEdit.
      -t Otwiera się z domyślnym edytorem tekstu.
      -f Odczytuje dane ze standardowego wejścia i otwiera za pomocą TextEdit.
      -F --fresh Uruchamia aplikację na świeżo, to znaczy bez przywracania systemu Windows. Zapisany trwały stan zostaje utracony, z wyjątkiem dokumentów bez tytułu.
      -R, --reveal Wybiera w Finderze zamiast otwierać.
      -W, - czekaj na aplikacje Blokuje do momentu zamknięcia używanych aplikacji (nawet jeśli były już uruchomione).
          --args Wszystkie pozostałe argumenty są przekazywane w argv do funkcji main () aplikacji zamiast otwierane.
      -n, --new Otwórz nowe wystąpienie aplikacji, nawet jeśli jest już uruchomione.
      -j, --hide Uruchamia aplikację ukrytą.
      -g, --background Nie przenosi aplikacji na pierwszy plan.
      -h, --header Przeszukuje lokalizacje plików nagłówkowych w poszukiwaniu nagłówków pasujących do podanych nazw plików i otwiera je.
      -s Dla -h, którego SDK użyć; jeśli podano, przeszukiwane są tylko zestawy SDK, których nazwy zawierają wartość argumentu.
                        W przeciwnym razie używany jest pakiet SDK o najwyższej wersji na każdej platformie.
Halomaple
źródło
-2

Znalazłem rozwiązanie: walkę ze złem ze złem.

Uruchamiam aplikację za pomocą tego rodzaju polecenia:

/Applications/Mail.app/Contents/MacOS/Mail & exit

Pocisk natychmiast wychodzi. A aplikacja przetrwa, nawet po zamknięciu okna terminalu.

Ale to rozwiązanie nie jest bardzo przydatne.

Nicolas Barbulesco
źródło
1
Naprawdę powinieneś otwierać aplikacje, które są dołączone do pakietu open . To dowód na przyszłość, ponieważ zawartość pakietu zmienia się, podobnie jak kanoniczny.
Ian C.
@Ian - Tutaj jestem szczególnie zainteresowany otwieraniem aplikacji, które znajdują się na określonej ścieżce, nie są w /Applicationspakiecie z moim komputerem Mac i nie są do niego dołączone.
Nicolas Barbulesco
1
.appfoldery nazywane są „pakietami”, a openpolecenie może je uruchomić bez względu na to, czy znajdują się w /Applicationsfolderze, czy w innym folderze. Termin „pakiet” w tym kontekście nie oznacza „dostarczany z systemem OS X”.
nikt
Otwórz to to samo, co kliknięcie ikony. To nie to samo, co uruchomienie aplikacji z wiersza poleceń, jak prosi OP.
Ted Bigham