하위 프로세스의 Ctrl + c는 스크립트에서 이전에 nohup’ed 프로세스를 종료합니다. 로그 파일로 출력하는 것입니다. 그런

나는 이것이 코딩 버그이기 때문에 SO에 속하는지 알지 못했지만 사용 된 소프트웨어의 미묘함에 대해 더 잘 알고 있다고 생각했습니다 (아마도 U & L도 고려 될 수 있음).

최소한의 코드 스크립트는 다음과 같습니다 (전체 스크립트의 수정 사항 참조,이 방법으로 수행하는 이유가 있습니다).

#/bin/bash
nohup {SERVERCOMMAND} > currentOutput.log 2>&1 &

less +F currentOutput.log

수행하려는 작업은 백그라운드에서 서버를 실행하여 로그 파일로 출력하는 것입니다.
그런 다음을 follow사용하여 로그 파일을 작성 less +F합니다. 당신이 할 때, 이것을 종료하려면 ctrl+ c를 치기 전에 누르십시오 Q.

무슨 일이 일어 났는지, 명령을 ctrl+ 중지 할 때 (중지하려면 ) 어떻게 든 맨 처음부터 서버를 죽입니다 ! 다른 것은 영향을받지 않습니다. + 로그를 다시 시작하기 시작할 수 있습니다 (서버가 종료 된 후 새로운 정보를 얻지 못함) . 나머지 스크립트를 칠 경우 정상적으로 실행됩니다.clesstailingnohupshiftfQ

왜 이런 일이 발생하는지 아십니까? 어떻게 피해야합니까 / 다른 것을 사용해야합니까?


PS
서버 프로그램이을 듣고 ^C있을 수 있습니다. 문제 일 수 있습니다. 그것을 막기 위해 내가 할 수있는 일이 있습니까? 마찬가지로, 방금 {SERVERCOMMAND}자체적으로 (차단 방식으로) 실행할 때 ctrl+ 를 누르면 c즉시 죽일 수 없습니다. 인쇄하고 Received ^C signal, shutting down(자신을 죽입니다). 이것은 내가 로그인 할 때 일어나는 일 ^C입니다 less(파이널 Received ^C signal, shutting down은 로그에 기록됩니다).


PPS
나는 여러 가지 일을 해왔다 (아무 일도하지 않았다).

  • 변경하여 스크립트에서 stdin 연결을 끊으려고 시도

    nohup {SERVERCOMMAND} > currentOutput.log 2>&1 &
    to
    nohup echo '' | {SERVERCOMMAND} > currentOutput.log 2>&1 &
    or
    nohup cat /dev/null/ | {SERVERCOMMAND} > currentOutput.log 2>&1 &
  • 를 사용 stty intr ^G하여 인터럽트 명령을 대체했지만 ctrl+ g^C어쨌든 정확히 수행했습니다 (따라서 대신 터미널 에뮬레이터에 문제가있을 수 있습니다. konsole)

  • 배치 nohup및 / 또는 less괄호 안에 라인 (그 서브 쉘 만들기 위해)

  • xterm대신 스크립트를 실행konsole



답변

+ SIGINT때 모든 프로세스에 전송 되었다고 생각하는 것은 옳았 지만 다른 프로세스를 만들면 프로세스가 외부로 가져올 것이라고 생각하는 것은 어리 석었습니다 (에서 내 시도 참조 ).ctrlcprocess groupP.P.S.

이것은 정확한 사용 사례 일뿐만 아니라 올바른 해결책입니다.

내 스크립트가 어떻게 구성 되었는가에 대한 답은 완전하지 않았습니다. 이것이 현재 스크립트입니다.

#/bin/bash

setsid {SERVERCOMMAND} > currentOutput.log 2>&1 &
less +F currentOutput.log

서버는 I ctrl+ cin 후에도 계속 로그 파일로 출력합니다 less.

시간 내 주셔서 감사합니다.


답변

당신은 disown 을 시도 했습니까 ?

  disown -h %1

또는 직업이 무엇이든; disown 은 쉘 내장이며 매뉴얼 페이지 는 다음과 같이 말합니다.

자기 것이 아니라고 말하다

폐기 [-ar] [-h] [jobspec …]

옵션이 없으면 각 작업 스펙이 활성 작업 테이블에서 제거됩니다. 경우] -h' option is given, the job is not removed from the table, but is marked so that SIGHUP is not sent to the job if the shell receives a SIGHUP. If jobspec is not present, and neither the-a ‘도 -r' option is supplied, the current job is used. If no jobspec is supplied, the-a’제거하거나 모든 작업을 표시하는 옵션 수단; jobspec 인수가없는`-r ‘옵션은 작업을 실행중인 작업으로 제한합니다.

편집하다

재미있는 것은, 당신의 건축은 내 아치 리눅스에서 작동합니다 :

 $ cat testm
  #!/bin/sh

  nohup /home/mario/temp/waste &

  less +F out.log

 $ cat waste
  #!/bin/sh

  while [ 1 ]; do
    find / -print 2>1 1> out.log
  done
  $ ./testm
   nohup: appending output to nohup.out
  $ ps ax | grep waste
    19090 pts/2    S      0:00 /bin/sh /home/mario/temp/waste
    19124 pts/2    S+     0:00 grep waste]
  $

ps 명령을 실행 하기 전에 out.log 파일을 스크롤 한 다음 Ctrl+C, 스크롤해야했습니다 q.


답변