쉘이 종료 될 때 죽지 않는 프로세스를 어떻게 포크합니까?


31

쉘에서 emacs를 실행하면 :

$ emacs foo &

그 껍질을 죽이면 이맥스는 죽습니다

쉘이 죽을 때 죽지 않도록 명령을 어떻게 실행할 수 있습니까?

nohup에 대한 언급을 찾았지만 도움이되지 않는 것 같습니다.

$ nohup emacs foo &

쉘이 죽으면 여전히 이맥스를 죽입니다.

답변:


13

이것이 X 앱 또는 콘솔 앱으로 실행되고 있는지 언급하지 않습니다.

콘솔 앱인 경우에는 종료해야합니다. 입력 / 출력, 더 기술적으로 (의사) tty를 제거했습니다. 이것이 당신이 의미 한 것은 아닐 것이므로 X 앱에 대해 이야기하고 있다고 가정 해 봅시다.

nohup왜 그렇지 않은지 잘 모르겠습니다. 쉘이 닫히면 SIGHUP프로세스 그룹의 모든 프로세스로 전송 됩니다. nohup은 SIGHUP을 무시하도록 명령에 지시합니다.

프로세스 그룹과 프로세스의 연결을 끊는 setsid를 시도 할 수도 있습니다.

alias emacs='setsid emacs'

또는 disown나중에 추가하십시오&


아, 훌륭한 setsid 작품. 명확하지 않은 것에 대해 죄송합니다. 예, 실제로 쉘에서 실행되지 않는 X 앱을 말합니다. 기본적으로 쉘에서 emacs (또는 다른 프로세스)를 시작하고 싶지만 쉘에 묶여있는 방식은 원하지 않습니다. 편의를 위해 시작했습니다.
sligocki

41

가장 신뢰할 수있는 방법은 다음과 같습니다.

(setsid emacs &)

( &)백그라운드로 포크 setsid하고 제어하는 ​​tty에서 분리 하는 데 사용 됩니다 .

이것을 쉘 함수에 넣을 수 있습니다.

fork() { (setsid "$@" &); }

fork emacs

가능성은 다음과 같습니다.

  • disown내장 명령 :

    emacs &
    disown $!
    

    &명령 구분 기호 역할 disown을하며 가장 최근 작업으로 기본 설정되므로 다음과 같이 단축 할 수 있습니다.

    emacs & disown
    
  • 이중 fork():

    (emacs &)
    

    괄호 안의 명령 ( )은 별도의 셸 프로세스에서 실행됩니다.

  • setsidRich에서 제안한대로 새 세션 을 작성하여 프로세스의 제어 TTY를 설정 해제하기 때문에 최선의 선택 일 수 있습니다 .

    setsid emacs
    

    그러나 그것은 또한 예측할 수 없습니다- fork()프로세스 그룹의 리더 인 경우 에만 배경이됩니다 ( 예를 들어 스크립트 setsid에서 사용되는 경우에는 발생하지 않습니다. 이러한 경우 에는 shCtrl- 기음.)


큰! 이것들은 모두 나를 위해 일합니다. 무기고에 도구가 더있어서 반갑습니다.
sligocki

흠 ... (exec emacs)작동할까요?
Hello71

@Hello : 그냥 다를 바 없습니다 (emacs). 서브 쉘에 단일 명령이 제공되면 exec적어도의 경우에 묵시적입니다 bash. bash -c 'foo'vs에 동일하게 적용됩니다 bash -c 'exec foo'. (그러나 emacs 자체 가 터미널에서 분리 될 수 있습니다. 예를 들어 gvim이이를 수행합니다. 알려진 동작이있는 프로그램으로 테스트하는 것이 좋습니다.)
grawity

더블 포크 기술을 배우기에 좋습니다. 감사!
Dave Abrahams

내 자신의 문제를 해결하기 위해 조업하는 동안 이것을 발견했습니다. (setsid emacs &)가 나를 위해 일했습니다. 잘 작성된 답변에 감사드립니다.
Paulb

5

쉘 설정을 확인하십시오. 대신 화면 을 사용해 볼 수도 있습니다 nohup.


로그 아웃하기 전에 연결을 끊는 데 screen -r사용 하면 화면에서 나중에 프로세스로 돌아갈 수 있습니다 Ctrl-A Ctrl-D.
Broam

이것은 매우 좋은 지적입니다. 나는 서브 쉘을 포크하고 다른 작업을 완료하기를 기다리지 않고 진행하지만 그 반대가 필요하지만 screen -d -m sh -c "{do stuff } exit"훨씬 더 합리적입니다.
니모
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.