이미 시작된 프로세스를 nohup / screen 할 수 있습니까?


260

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

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


4
에 대한 흥미로운 블로그 게시물을 보았습니다 disown. blogs.oracle.com/ksplice/entry/disown_zombie_children_and_the
ojrac

답변:


212

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

자기 것이 아니라고 말하다

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

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


대박; 나는 이런 식으로 뭔가를 기대하고있었습니다.
ojrac 2016 년

7
인생은 불공평 할 수 있습니다. gharper와 나는 이것을 거의 같은 시간에 게시했다 :)
serverhorror

4
당신은 나의 영웅입니다
Thomas Dignan

9
disown은 bash에만 국한되지 않습니다. 또한 zsh, ksh93에도 있습니다.
Phil P

2
나는 당신이 실제로 사용할 필요가 있음을 발견 disown %1하면 그냥 사용하는 경우 (1)가 jobspec 경우 FG 또는 BG는 달리, bg 1 serverwatch.com/tutorials/article.php/3935306/...
mltsy

81

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.)

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


빌트인 툴 (예 : disown)을 고수 할 것이지만, reptyr만큼 유연하지는 않습니다. +1
ojrac


16

프로세스가 시작되면 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로 무언가를 시도하면 불운으로 운이있을 수 있습니다.


2
좋은 댓글은 +1입니다. st (din | out | err)는 문제의 다른 절반이며, 다음에이 잼에 빠질 때 어디에서 찾아야하는지 조언 해 주셔서 감사합니다.
ojrac 2016 년

6
실제로 대부분의 유닉스에서 변경할 수 있습니다. 역겨운 해킹입니다. 나는 그것을 좋아한다. :) 당신이하는 일은 ptrace와 같은 디버그 지원을 사용하여 프로세스에 연결 한 다음 프로세스가 dup2 ()를 강제로 호출하여 0,1,2를 다른 파일 핸들에 다시 연결하는 것입니다.
Zan Lynx

2
예, 변경할 수 있습니다. 프로세스 일시 정지 (SIGSTOP) 및 fd 0, 1, 2에 대한 파일 디스크립터 수정과 관련됩니다 (SIGCONT).
Michael Martinez

13

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


1
좋은! 프로세스 마이그레이션에 대한 마스터 논문에 cryopid를 사용하려고 시도했지만 내가 한 일에 관계없이 항상 작동하지 않았습니다. 결국, 나는 고대 버전의 Linux에서 dynckpt를 사용해야했습니다. 당신은 아마도 cryopid의 개발에 참여하고 있습니까? 귀하의 이름은 저자의 도메인과 유사합니다.
Juliano 2016 년

1
나는 개발에 관여하지 않고 단지 대학의 저자를 알고 있습니다. 그는 순간 cryopid 유지하는 시간을 가지고 있지 않기 때문에 어떤 사람들은 그것을 작업을 시작 것 같습니다 sharesource.org/project/cryopid
TRS-80

12

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

그러나 당신은 시도해 보았습니다 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.


5

나는 최근 neercs 링크를 보았습니다. neercs는 컬러 ASCII 아트 라이브러리 인 libcaca를 사용하여 작성된 화면과 유사한 유틸리티입니다. 다른 기능 중에서도 기존 프로세스를 가져와 neercs (스크린) 세션 내에서 다시 보호 할 수 있습니다.

그러나 그것을 사용하지 않았으므로 작동하는지 여부에 대해서는 언급 할 수 없습니다.


2

나는 아마도 이것을 생각하지 못하고 있으므로 자유롭게 수정하십시오 (이미 Disown에 대해 이미 배웠습니다!) ... ctrl-Z와 "bg"가 적어도 백그라운드에서 프로세스를 실행하도록 작동하지 않습니까? 아니면 STDOUT이 실행되는 동안 여전히보고 싶은 주요 문제입니까?


1
소유 청각이 때문에 영업 이익은 자신이하고 싶지 않은 것입니다 명령 실행, 개시된 경우 상자를 떠날 필요가 죽을 때 그것은 여전히 프로세스를 종료 것
serverhorror

알겠습니다. 설명 주셔서 감사합니다. 그래서 disown -h 제안은 내 것보다 훨씬 더 똑똑해 보인다 :-)
Chris_K


2

프로세스와 상호 작용할 수 없어서 살아남을 수 있고 임의의 커널 모듈을로드하는 것에 반대하지 않는다면 Snoop 을 보는 것보다 더 나쁠 수 있습니다. 또는 다른 두 가지 프로젝트가 있습니다. 여기 에 하나의 호출 injcode가 있는데, 대부분 원하는 작업을 수행 할 수 있습니다.



1

복잡한 인증 프로세스와 사용하기 어려운 숨겨진 뷰 상태가 많은 ASP.NET 웹 사이트에서 파일을 다운로드 한 후 명령 줄 브라우저 nohup를 시작하고 links첨부 하기 위해 (또는 유사한) 것을 사용하고 싶었 습니다. 와 curl/ wget.

나는 마침내 tmux작업을 훌륭하게 해결 한 것을 사용했습니다 .

  1. 운영 tmux
  2. links내 경우에는 앱을 실행 하고 실행 상태로 두십시오.
  3. SSH 세션을 닫으면 앱이 계속 실행됩니다.
  4. 나중에 같은 머신에 SSH로 연결 tmux attach하고 앱을 다시 화면으로 가져 오기 위해 실행

tmux는 훌륭하지만 nohup 또는 screen과 같이 프로세스를 시작하기 전에 사용하는 경우에만 작동합니다. 이 질문은 프로세스가 이미 실행 된 후 tmux가 필요하다는 것을 깨달을 때입니다.
ojrac

-1

세션 시간 초과가 걱정 되십니까? 이 경우 프로세스를 Ctrl-z 및 bg 한 다음 "ping -t localhost"또는 "top"처럼 세션을 활성 상태로 유지하기 위해 무언가를 넣을 수 있습니다.

로그 아웃하려는 경우 다른 의견에 추가 할 수 없습니다.


로그 아웃입니다.
ojrac 2016 년

1
연결을 끊는 또 다른 방법은 상단을 달리는 것입니다. THat는 항상 몇 바이트를 섞습니다.
Rory
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.