이미 시작된 프로세스를 nohup / screen 할 수 있습니까? 저주하고 screen있습니다. nohup프로세스 를 “반복적으로”할 수있는 방법이

SSH를 통해 장기 실행 데이터 마이그레이션 스크립트의 테스트 실행을 수행하고 있습니다. 오후 4 시경에 스크립트를 실행한다고 가정 해 봅시다. 자, 오후 6 시가 돌아 서서이 일을 모두하지 않기로 저주하고 screen있습니다.

nohup프로세스 를 “반복적으로”할 수있는 방법이 있습니까 , 아니면 밤새 내 컴퓨터를 온라인 상태로 두어야합니까? 이미 시작한 프로세스 에 첨부 screen/ 연결할 수 nohup없다면 왜 그렇습니까? 부모 / 자녀 프로세스가 상호 작용하는 방식과 관련이 있습니까? (적어도 ‘왜’에 대한 질문을 다루지 않는 “아니오”라는 대답은 받아 들일 수 없습니다. 죄송합니다;)



답변

Bash를 사용하는 경우 다음을 실행할 수 있습니다. disown -h job

자기 것이 아니라고 말하다

disown [-ar] [-h] [jobspec ...]

옵션이 없으면 각 작업 스펙이 활성 작업 테이블에서 제거됩니다. 경우 -h옵션이 주어 작업이 테이블에서 제거되지 않습니다 만, 쉘이 SIGHUP를 수신하는 경우 그 SIGHUP이 작업에 전송되지 않도록 표시됩니다. jobspec이 -a없고 nor -r옵션이 제공 되지 않으면 현재 작업이 사용됩니다. jobspec이 제공되지 않으면이 -a
옵션은 모든 작업을 제거하거나 표시하는 것을 의미합니다. -rjobspec 인수가없는 옵션은 작업을 실행하는 작업을 제한합니다.


답변

reptyr 사용

읽어보기에서 :

reptyr - A tool for "re-ptying" programs.
-----------------------------------------

reptyr is a utility for taking an existing running program and
attaching it to a new terminal. Started a long-running process over
ssh, but have to leave and don't want to interrupt it? Just start a
screen, use reptyr to grab it, and then kill the ssh session and head
on home.

USAGE
-----

  reptyr PID

"reptyr PID" will grab the process with id PID and attach it to your
current terminal.

After attaching, the process will take input from and write output to
the new terminal, including ^C and ^Z. (Unfortunately, if you
background it, you will still have to run "bg" or "fg" in the old
terminal. This is likely impossible to fix in a reasonable way without
patching your shell.)

저자의 몇 가지 블로그 게시물 :


답변

하나의 tty에서 현재 tty로 프로세스를 훔치기 위해이 해킹을 시도 할 수 있습니다.

http://www.ucc.asn.au/~dagobah/things/grab.c

현재 Linux / glibc 버전으로 컴파일하려면 약간의 재 포맷이 필요하지만 여전히 작동합니다.


답변

프로세스가 시작되면 STDIN, STDOUT 및 STDERR이 무언가에 연결됩니다 . 일반적으로 명령이 시작되면 변경할 수 없습니다. 설명하는 경우 아마도 ssh 세션과 관련된 tty 일 것입니다. nohup은 거의 …

command < /dev/null > nohup.out 2>&1

즉, STDIN을 / dev / null로, STDOUT을 파일로, STDERR을 STDOUT으로 설정합니다. Screen은 자체적으로 지시하는 tty 설정과 관련하여 훨씬 정교한 작업을 수행합니다.

실행중인 프로세스를 소급 적으로 정리하거나 선별하는 방법을 모르겠습니다. / proc / $ pid / fd로 cd하고 0, 1 및 2가 무엇을 가리키는 지 확인하십시오.

프로세스가 STDIN, STDOUT 또는 STDERR로 무언가를 시도하면 불운으로 운이있을 수 있습니다.


답변

Cryopidgrab.c의 개발자 가 프로세스를 파일로 고정시킨 다음 화면에서 실행하여 프로세스를 다시 시작하는 추가 개발입니다.


답변

나는 화면 부분에 대한 이유없이 당신에게 간단한 “아니오”만 줄 수 있습니다, 나는 그대 자신에 관심이 있습니다.

그러나 당신은 시도해 보았습니다 disown(bash 내장)

~ $ echo $SHELL
/bin/bash
~ $ type disown
disown is a shell builtin
~ $ help disown
disown: disown [-h] [-ar] [jobspec ...]
     By default, removes each JOBSPEC argument from the table of active jobs.
    If the -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.  The -a option, when JOBSPEC is not supplied, means to remove all
    jobs from the job table; the -r option means to remove only running jobs.

답변

Solaris / OpenSolaris의 nohup에는 실행중인 프로세스를 nohup하기위한 -p 플래그가 있습니다 (예 : Solaris 10 nohup 매뉴얼 페이지 참조) .