터미널에서 시작된 응용 프로그램이 바람직하지 않게 종료되는 것을 방지하는 방법


10

다음과 같은 명령으로 터미널에서 응용 프로그램을 시작합니다.

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

중요한 부분은  &입니다.

  • 유닉스 / 리눅스 / Solaris :

    • 나는 학교 &에서 프로그램 을 추가하면 스스로 프로그램 을 운영한다는 것을 배웠다  .
    • xeyes &쉘을 닫은 후에도 같은 명령을 실행하고 프로그램을 안전하게 실행하는 것을 기억  합니다.
  • Mac OS X (Unix inside) :

    1. 응용 프로그램을 시작  &하고 터미널 창을 닫습니다. 응용 프로그램이 종료됩니다!
    2. Mac OS X에서이 바람직하지 않은 동작이 발생하는 이유는 무엇입니까?
    3. 이 문제를 어떻게 해결할 수 있습니까?

답변:


7

Linux, FreeBSD 또는 기타 시스템뿐만 아니라 OS X에서도 원하는 것을 달성하는 "표준"방법은 다음 명령을 사용하는 것입니다 nohup.

nohup program &

이것은 시작합니다 program때문에의 쉘 배경 상대에 실행되는, &- 인해 nohup 명령에 신호를 끊기 무시합니다.

이렇게하면 쉘을 닫아도 프로그램이 계속 실행됩니다. Terminal.app을 닫았 기 때문에 셸을 닫거나 ssh 연결에서 컴퓨터 또는 이와 유사한 연결을 끊기 때문에 셸을 닫는 것은 중요하지 않습니다.


1
nohup.out현재 폴더에 파일이 생성됩니다 . 쓸 것이 없을 때에도. 몇 주 후에, 나는 nohup.outMac의 모든 곳에 파일이있을 것 입니다. :-(
Nicolas Barbulesco 2018

1
@NicolasBarbulesco 사용 중 nohup command>/dev/null&또는 command&disown.
Lri

6

터미널 창을 닫으면 SIGHUP (hangup 신호)을 쉘로 보낸 다음 SIGHUP을 시작한 모든 프로세스보냅니다 . 이것은 bash와 다른 많은 쉘에 대한 전통적인 동작이며 이것에 대한 전통적인 해결책은 nohup을 사용하는 것입니다.

유닉스 머신마다 다른 방법이 있으므로 사용했던 특정 터미널 에뮬레이터 나 사용한 특정 셸이 다르게 동작 할 수 있습니다. 그러나 이것은 OS X에만 국한된 것이 아닙니다. 예를 들어, 우분투에서도 이와 동일한 문제에 대한 질문이 있습니다.


6

앰퍼샌드 " &"를 사용하면 터미널 자체가 쉘 자체의 백그라운드에서 프로세스를 실행하도록 지시합니다. 따라서 셸을 닫고 프로세스를 종료하면 GUI (Mail.app 자체)도 닫힙니다.

터미널에서 Mail을 시작하는 올바른 명령은 다음과 같습니다.

open -a Mail; exit

편집 : 방금 U & L 스택 교환에서 이것을 발견했습니다 : 셸 스크립트 줄의 끝에서 앰퍼샌드는 무엇을 의미합니까? 제공되는 답변은 훌륭하며 현재 진행되고있는 일을 내가 할 수있는 것보다 더 자세하고 자세하게 설명합니다! 나는 그것을 통해 읽는 것이 좋습니다.


명령 줄 매개 변수를 앱에 전달하는 것은 어떻습니까? 이처럼 :/Users/nicolas/Desktop/Firefox-29-fr/Firefox.app/Contents/MacOS/firefox -profile "/Users/nicolas/Desktop/Firefox-29-fr/Profil-Firefox-29-fr/" -no-remote &
니콜라스 Barbulesco

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 &
니콜라스 Barbulesco

@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을 무시할 수 있습니다.


좋은 대답이지만 여전히 복잡합니다. 그리고 멋진 프로필 이미지. :-)
Nicolas Barbulesco

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, --wait-apps 사용 된 응용 프로그램이 닫힐 때까지 (이미 실행중인 경우에도) 차단합니다.
          --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
open 과 함께 번들로 제공되는 응용 프로그램을 실제로 열어야 합니다. 번들 내용과 정식 변경으로 미래의 증거입니다.
Ian C.

@Ian — 여기에없는 특정 경로에 /Applications있고 Mac과 번들로 제공 되지 않는 응용 프로그램을 여는 데 특히 관심이 있습니다.
Nicolas Barbulesco

1
.app폴더를 "번들"이라고하며 open명령은 /Applications폴더 에 있든 다른 폴더 에 있든 시작할 수 있습니다 . 이 문맥에서 "번들"이라는 용어는 "OS X와 ​​함께 제공됨"을 의미하지 않습니다.
아무도

열기는 아이콘을 클릭하는 것과 같습니다. OP가 요구하는 명령 줄에서 앱을 시작하는 것은 아닙니다.
Ted Bigham
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.