나는 이것이 코딩 버그이기 때문에 SO에 속하는지 알지 못했지만 사용 된 소프트웨어의 미묘함에 대해 더 잘 알고 있다고 생각했습니다 (아마도 U & L도 고려 될 수 있음).
최소한의 코드 스크립트는 다음과 같습니다 (전체 스크립트의 수정 사항 참조,이 방법으로 수행하는 이유가 있습니다).
#/bin/bash
nohup {SERVERCOMMAND} > currentOutput.log 2>&1 &
less +F currentOutput.log
수행하려는 작업은 백그라운드에서 서버를 실행하여 로그 파일로 출력하는 것입니다.
그런 다음을 follow
사용하여 로그 파일을 작성 less +F
합니다. 당신이 할 때, 이것을 종료하려면 ctrl+ c를 치기 전에 누르십시오 Q.
무슨 일이 일어 났는지, 명령을 ctrl+ 중지 할 때 (중지하려면 ) 어떻게 든 맨 처음부터 서버를 죽입니다 ! 다른 것은 영향을받지 않습니다. + 로그를 다시 시작하기 시작할 수 있습니다 (서버가 종료 된 후 새로운 정보를 얻지 못함) . 나머지 스크립트를 칠 경우 정상적으로 실행됩니다.cless
tailing
nohup
shiftfQ
왜 이런 일이 발생하는지 아십니까? 어떻게 피해야합니까 / 다른 것을 사용해야합니까?
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 group
P.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.