Як запобігти небажаному виходу програми, запущеної в Terminal?

Я запускаю програми з терміналу з такими командами:

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

The important part is the &.

  • For Unix / Linux / Solaris :

    • I have learned at school that adding the & makes the program live on his own.
    • I strongly remember launching a command like xeyes & and having the program running safe even after I close the shell.
  • On Mac OS X (Unix inside) :

    1. I launch an app with & and I close the Terminal window : the application exits !
    2. Why does this undesirable behaviour happen on Mac OS X ?
    3. How can this be fixed ?
10
Відповідне питання: apple.stackexchange.com/q/119319/20773
додано Автор Marvin, джерело

7 Відповіді

"Стандартний" спосіб виконання того, що ви хочете виконати (на OS X, а також на Linux, FreeBSD або інших системах) полягає у використанні команди nohup :

nohup program &

This will start program, which will run in the background relative to the shell because of the & - and will ignore hangup signals due to the nohup command.

Таким чином, програма буде продовжувати працювати, навіть якщо ви закриваєте оболонку. Немає значення, якщо ви закриваєте оболонку, тому що закриваєте Terminal.app, або закриваєте оболонку, тому що ви відключаєтеся від ssh-з'єднання до комп'ютера або подібного.

7
додано
@NicolasBarbulesco Використовуйте команду nohup>/dev/null & або command & disown .
додано Автор Dan, джерело
Це створює файл nohup.out у поточній папці. Навіть коли писати нема чого. Через кілька тижнів я мав би файли nohup.out скрізь у своєму Mac. :-(
додано Автор batk201, джерело

Коли ви закриваєте вікно терміналу, воно посилає SIGHUP (сигнал зависання) на оболонку, яка потім надсилає SIGHUP до всіх запущених процесів . Це традиційна поведінка для bash і багатьох інших оболонок, і традиційним рішенням цього є використання nohup.

There are ways that different Unix machines can differ, so it's possible that the specific terminal emulators you used or the specific shells you used behaved different. But it's not specific to OS X. For example, there is a question on this same issue on Ubuntu.

6
додано

Using the ampersand "&", you are telling Terminal to run the process in the background of the shell itself. Thus, when you close the shell (and kill the process), the GUI (Mail.app itself) will also close.

Правильна команда для запуску Mail з терміналу - це просто:

open -a Mail; exit

Edit: I just found this over at U&L Stack Exchange: What does ampersand mean at the end of a shell script line? The answers provided are excellent and explain exactly what's going on in more detail and better than I ever could! I highly recommend reading through it.

6
додано
@NicolasBarbulesco Це окреме питання - див. сторінка man for open , і я думаю, що тут питання
додано Автор yoliho, джерело
Що про передачу параметрів командного рядка до програми? Так: /Users/nicolas/Desktop/Firefox-29-fr/Firefox.app/Contents/Ma‌ cOS/firefox -profile "/ Користувачі/nicolas/Desktop/Firefox-29-fr -29-fr/"-no-remote &
додано Автор batk201, джерело
@njboot - працює - за допомогою /. Але це припиняє моє вікно Терміналу.
додано Автор batk201, джерело
Отже: open /Applications/Mail.app/Contents/MacOS/Mail; exit Запускає програму Mail. Але: це припиняє мій термінал. І це відкриває нове вікно Терміналу. І, коли я закриваю нове вікно Терміналу, Mail небажано виходить! Назад до квадрата 1.
додано Автор batk201, джерело
А як щодо запуску певної програми, яка не знаходиться в /Applications , але на певному шляху? Так: /Users/nicolas/Desktop/Firefox-29-fr/Firefox.app/Contents/Ma‌ cOS/firefox -profile "/ Користувачі/nicolas/Desktop/Firefox-29-fr -29-fr/"-no-remote &
додано Автор batk201, джерело
На жаль, все ще потрібно використовувати аргумент -a: open -a Applications/Mail.app/Contents/MacOS/Mail; вийти
додано Автор linusthe3rd, джерело
@NicolasBarbulesco відкрити [повний шлях], або перейдіть до каталогу та відкрийте [файл]. Ви можете використовувати ~/для вашої домашньої теки і спеціального символу, "asterisk", як більш короткий нотації, якщо ніякі інші рядки не відповідають значенню, IE: ~/De */Fire * ... і так далі. Або просто напишіть простий скрипт: cat> nameofscript ..... #!/bin/sh .... відкрити [повний шлях] .... ^ D ..... chmod + x nameofscript ..... і необов'язково, mv nameofscript $ PATH/yourpersonalbin. Рекомендую читати людину відкритим. Це проста команда, і як проста команда компроміс - це не те, що є потужним.
додано Автор linusthe3rd, джерело
open не веде себе як запуск програми з командного рядка. Якщо воно вже запущено, вікно просто виведене на фронт, воно не виконується знову.
додано Автор user129457, джерело

Я знайшов рішення:

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

Це просто, це досить, і це працює!

В дужках () запускається команда у під-оболонці.

3
додано
- І повертається з програми до оболонки без очікування, так що ви можете продовжувати використовувати оболонку або завершити її, без програми, яку ви почали виходити.
додано Автор r_alex_hall, джерело
Це працювало і для мене, спасибі
додано Автор frbl, джерело

@jksoegaard has the proper commands but as you mentioned in the comment, it creates a nohup.out file. To stop the nohup.out file from being created, you need to redirect STDOUT and STDERR somewhere else. The complete command would be nohup program &>/dev/null &. This will run your program in the background, ignoring the SIGHUP, and sending all STDOUT and STDERR to /dev/null.

Проте, якщо ви не пам'ятаєте додати nohup (як у вашому початковому запиті), ви можете скористатися командою disown -arh , щоб позначити всі запущені завдання з ігноруванням SIGHUP.

3
додано
Хороший відповідь, але все ще складний. І хороший профіль зображення. :-)
додано Автор batk201, джерело

Я знайшов рішення: боротися зі злом.

Я запускаю свою програму за допомогою такої команди:

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

Оболонка виходить відразу. І додаток виживає, навіть після закриття вікна Терміналу.

Але це рішення не дуже зручно.

2
додано
Ви дійсно повинні відкривати програми, які постачаються в комплекті з відкрити . Це підтвердження майбутнього, оскільки зміна вмісту пучків, а також канонічне.
додано Автор shsteimer, джерело
Теки .app називаються "пакети", а команда open може запускати їх, незалежно від того, чи вони знаходяться в папці /Applications або в будь-якій іншій папці. Термін "розшарування" у цьому контексті не означає "поставляється з OS X".
додано Автор Mike H, джерело
@Ian - Тут я особливо зацікавлений у відкритті додатків, які знаходяться на певному шляху, а не в /Applications , а не в комплекті з Mac
додано Автор batk201, джерело
відкрити те ж саме, що і натиснути піктограму. Це не те ж саме, що запуск програми з командного рядка, як просить OP.
додано Автор user129457, джерело

Or you can try open -a /Applications/Mail.app

Usage: open [-e] [-t] [-f] [-W] [-R] [-n] [-g] [-h] [-s ][-b ] [-a ] [filenames] [--args arguments]
Help: Open opens files from a shell.
      By default, opens each file using the default application for that file.
      If the file is in the form of a URL, the file will be opened as a URL.
Options:
      -a                Opens with the specified application.
      -b                Opens with the specified application bundle identifier.
      -e                Opens with TextEdit.
      -t                Opens with default text editor.
      -f                Reads input from standard input and opens with TextEdit.
      -F  --fresh       Launches the app fresh, that is, without restoring windows. Saved persistent state is lost, excluding Untitled documents.
      -R, --reveal      Selects in the Finder instead of opening.
      -W, --wait-apps   Blocks until the used applications are closed (even if they were already running).
          --args        All remaining arguments are passed in argv to the application's main() function instead of opened.
      -n, --new         Open a new instance of the application even if one is already running.
      -j, --hide        Launches the app hidden.
      -g, --background  Does not bring the application to the foreground.
      -h, --header      Searches header file locations for headers matching the given filenames, and opens them.
      -s                For -h, the SDK to use; if supplied, only SDKs whose names contain the argument value are searched.
                        Otherwise the highest versioned SDK in each platform is used.
0
додано