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


10

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

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

Важливою частиною є  &.

  • Для Unix / Linux / Solaris:

    • У школі я дізнався, що додавання програми  &робить програму жити самостійно.
    • Я сильно пам'ятаю, як запустити таку команду, як  xeyes &і програма запускається в безпеці навіть після закриття оболонки.
  • На Mac OS X (Unix всередині):

    1. Я запускаю програму  &і закриваю вікно терміналу: програма виходить!
    2. Чому така небажана поведінка трапляється на Mac OS X?
    3. Як це можна виправити?

Питання, пов’язані з цим: apple.stackexchange.com/q/119319/20773
Eric3

Відповіді:


7

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

nohup program &

Це почнеться program, який запуститься у фоновому режимі відносно оболонки через &- і ігнорує сигнали відключення через команду nohup.

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


1
Це створює файл nohup.outу поточній папці. Навіть коли нема чого писати. Через кілька тижнів я мав би файли nohup.outвсюди на своєму Mac. :-(
Ніколя Барбулеско

1
@NicolasBarbulesco Використовуйте nohup command>/dev/null&або command&disown.
Лрі

6

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

Існують способи, що різні машини Unix можуть відрізнятися, тому можливо, що конкретні емулятори терміналів, які ви використовували, або конкретні оболонки, які ви використовували, поводилися по-різному. Але це не характерно для OS X. Наприклад, в цьому ж питанні на Ubuntu є питання.


6

Використовуючи амперсанд " &", ви повідомляєте Термінал запустити процес на тлі самої оболонки. Таким чином, коли ви закриєте оболонку (і вб'єте процес), GUI (Mail.app) також закриється.

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

open -a Mail; exit

Редагувати: Я щойно знайшов це на U&L Stack Exchange: Що означає "ampersand" в кінці рядка сценарію оболонки? Надані відповіді відмінні і пояснюють, що саме відбувається більш детально і краще, ніж я коли-небудь міг! Я настійно рекомендую прочитати його.


Що з передачею програм в командний рядок? /Users/nicolas/Desktop/Firefox-29-fr/Firefox.app/Contents/MacOS/firefox -profile "/Users/nicolas/Desktop/Firefox-29-fr/Profil-Firefox-29-fr/" -no-remote &
Ось так

2
@NicolasBarbulesco Це окреме запитання - дивіться відкриту сторінку, і я думаю, що тут питання
user151019

А як запустити конкретну програму не в /Applications, а на певному шляху? /Users/nicolas/Desktop/Firefox-29-fr/Firefox.app/Contents/MacOS/firefox -profile "/Users/nicolas/Desktop/Firefox-29-fr/Profil-Firefox-29-fr/" -no-remote &
Ось так

@NicolasBarbulesco відкрийте [повний шлях] або cd до каталогу та відкрийте [файл]. Ви можете використовувати ~ / для вашої домашньої папки та спеціального символу "зірочку", як коротші позначення, припускаючи, що жодні інші рядки не відповідають значенню, IE: ~ / De * / Fire * ... et cetera. Або просто напишіть простий скрипт: cat> nameofscript ..... #! / bin / sh .... відкрити [повний шлях] .... ^ D ..... chmod + x nameofscript ...... \ nameofscript .... і необов'язково, mv nameofscript $ PATH / yourpersonalbin. Я рекомендую читати людину відкрито. Це проста команда, і як проста команда компроміс - це не так потужно.
njboot

1
Вибачте, все ж потрібно використовувати аргумент -a:open -a Applications/Mail.app/Contents/MacOS/Mail; exit
njboot

4

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

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

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

В дужках  ( )запускають команду в підколонці.


--і & повертається з програми в оболонку, не чекаючи, тож ви можете продовжувати використовувати оболонку або припиняти її, без програми, яку ви починали виходити.
r_alex_hall

3

@jksoegaard має належні команди, але, як ви згадали в коментарі, він створює файл nohup.out. Щоб зупинити створення файлу nohup.out, вам потрібно переспрямувати STDOUT та STDERR кудись ще. Повна команда була б nohup program &>/dev/null &. Це запустить вашу програму у фоновому режимі, ігноруючи SIGHUP та відсилаючи всі STDOUT та STDERR в / dev / null.

Однак якщо ви не пам’ятаєте додати nohup (як, наприклад, у своєму початковому запитанні), ви можете використовувати disown -arhкоманду для позначення всіх фонових запущених завдань, щоб ігнорувати SIGHUP.


Гарна відповідь, але все ще складна. І приємне зображення профілю. :-)
Ніколя Барбулеско

0

Або ви можете спробувати open -a /Applications/Mail.app

Використання: відкрити [-e] [-t] [-f] [-W] [-R] [-n] [-g] [-h] [-s] [- b] [-a] [назви файлів] [- аргументи аргументів]
Довідка: Open відкриває файли з оболонки.
      За замовчуванням відкриває кожен файл, використовуючи програму за замовчуванням для цього файлу.
      Якщо файл у вигляді URL-адреси, файл буде відкритий у вигляді URL-адреси.
Параметри:
      -a Відкривається із вказаною програмою.
      -b Відкривається із заданим ідентифікатором пакету додатків.
      -e відкривається з TextEdit.
      -t Відкривається за допомогою текстового редактора за замовчуванням.
      -f Читає введення зі стандартного вводу та відкривається за допомогою TextEdit.
      -F - fresh Запускає додаток свіжим, тобто без відновлення вікон. Збережений постійний стан втрачається, виключаючи документи без назви.
      -R, --reveal Вибирається у Finder замість відкриття.
      -W, - зачекайте-додатки Блокує, поки використовувані програми не закриються (навіть якщо вони вже запущені).
          --args Всі решта аргументів передаються в argv до функції main () програми замість відкритого.
      -n, --new Відкрийте новий екземпляр програми, навіть якщо він вже працює.
      -j, --hide Запуск програми приховано.
      -g, --background Не виводить програму на перший план.
      -h, --header Пошук місця розташування файлів заголовків для заголовків, що відповідають заданим іменам, та відкриває їх.
      -s Для -h, SDK для використання; якщо вони постачаються, шукаються лише SDK, імена яких містять значення аргументу.
                        В іншому випадку використовується найвища версія SDK у кожній платформі.

-2

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

Я запускаю додаток із такою командою:

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

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

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


1
Ви дійсно повинні відкривати програми, які в комплекті з відкритими . Це майбутнє доказ, оскільки зміст вмісту пакета змінюється, а також канонічно.
Ян Ч.

@Ian - Тут я особливо зацікавлений у відкритті програм, які знаходяться на певному шляху, а не в /Applicationsмоїм Mac і не в комплекті.
Ніколя Барбулеско

1
.appпапки називаються "пакетами", і openкоманда може запустити їх, чи є вони в /Applicationsпапці чи будь-якій іншій папці. Термін "пакет" в цьому контексті не означає "поставляється з ОС X".
ніхто

відкрити - це те саме, що натиснути значок. Запуск програми з командного рядка не такий, як запитує ОП.
Тед Бігхем
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.