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


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.