하위 프로세스의 Ctrl + c는 스크립트에서 이전에 nohup'ed 프로세스를 종료합니다.


15

나는 이것이 코딩 버그이기 때문에 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


누군가가 수도 건너 내 문제; I think it is due to the handling within the database software, not on the shell. 프로그램은 어떻게이 작업을 수행합니까? 그렇다면 어떻게 막을 수 있습니까?
Hashbrown

3
nohup프로세스가 SIGHUP신호 를 수신하지 못하게하는 반면 CTRL + C는 SIGINT신호를 전송 합니다. 그것이 nohup기대했던 효과가없는 이유 입니다.
Piotr Dobrogost

답변:


11

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

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

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

#/bin/bash

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

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

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


0

당신은 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.


예,하지만 적용 방법을 모르겠습니다. 나는 그 자체 nohup로 함수에 라인을 배치하려고 시도 disowns했지만 그것은 동일해야합니다 nohup. 라인을 SIGHUP제거 할 때 less스크립트가 서버가 여전히 실행중인 것으로 결론을 내릴 때 이것이 문제 라고 생각하지 않습니다
Hashbrown

@Hashbrown pls는 내 편집을 참조하십시오
MariusMatutiae

예, {SERVER} 실행 파일 대신 간단한 bash 스크립트를 호출하여 테스트를 수행했습니다. 그리고 nohup은 잘 작동했습니다. 질문에 대한 내 의견을 참조하십시오. 나는 그것이 의도적으로 어떻게 든 듣고 있다고 생각합니다. 그것의 적절하고 (잘 알려지지 않은) 서버이기 때문에 나는 그것이 무엇인지 말할 수조차 없기 때문에 누군가가 "오, X를하고, Y를해야합니다"
Hashbrown
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.