programing

이미 실행 중인 프로세스를 nohup에 넣는 방법은 무엇입니까?

powerit 2023. 4. 23. 11:34
반응형

이미 실행 중인 프로세스를 nohup에 넣는 방법은 무엇입니까?

이미 장시간 진행 중인 프로세스가 있어 종료하고 싶지 않습니다.

nohup(단말기를 닫아도 계속 작동시키는 방법)으로 하려면 어떻게 해야 합니까?

bash의 Job Control을 사용하여 프로세스를 백그라운드로 전송합니다.

  1. Ctrl+Z 프로그램을 중지(정지)하고 쉘로 돌아갑니다.
  2. bg이치노
  3. disown -h [job-spec]여기서 번호입니다(예: [job-spec]).%1중인 의 경우, "", "번호 검색", "번호 검색", "번호 검색"jobscommand를 사용하면 터미널이닫혔을 때 되지 않습니다.command)

어떤 이유로 Z+도 동작하지 않는 경우 다른 단말기로 이동하여 프로세스 ID를 찾습니다(사용 방법).ps를 실행해 주세요: :실 、 음음 、 음: :: :: :: :: : ) 。

kill -SIGSTOP PID 
kill -SIGCONT PID

SIGSTOP되어 「」가 됩니다.SIGCONT백그라운드에서 프로세스를 재개합니다.따라서 두 터미널을 모두 닫아도 프로세스가 중단되지는 않습니다.

중인 으로 함)을=를 노업으로 함)입니다.disown및 기본적인 셸 명령어입니다.

bash-manpage(man bash)에서:

disn [ - ar ][ - h ] [ spec ... ]

옵션이 없으면 각 작업 사양이 활성 작업 테이블에서 제거됩니다.-h 옵션을 지정하면 각 jobspec은 테이블에서 삭제되지 않지만 셸이 SAHUP을 수신해도 작업에 SAHUP이 전송되지 않도록 표시됩니다.jobspec이 존재하지 않고 -a 옵션도 -r 옵션도 제공되지 않으면 현재 작업이 사용됩니다.jobspec이 지정되지 않은 경우 -a 옵션은 모든 작업을 삭제하거나 마킹하는 것을 의미합니다.jobspec 인수를 지정하지 않은 -r 옵션은 작업을 실행 중인 작업으로 제한합니다.jobspec이 유효한 작업을 지정하지 않는 한 반환값은 0입니다.

즉, 단순하고

disown -a

작업 테이블에서 모든 작업을 삭제하고 nohup으로 만듭니다.

위의 좋은 답변은 다음과 같습니다.명확한 설명을 덧붙이겠습니다.

수는 없다.disown, pid or process, your pid ( ) 。disown이치노

작업은 셸에 연결된 프로세스의 개념이기 때문에 작업을 백그라운드로 던지고(일시 중단이 아님) 작업을 해제해야 합니다.

문제:

%  jobs
[1]  running java 
[2]  suspended vi
%  disown %1

UNIX Job Control 의 상세한 것에 대하여는, http://www.quantprinciple.com/invest/index.php/docs/tipsandtricks/unix/jobcontrol/ 를 참조해 주세요.

도 ★★★★★★★★★★★★★★★.disown는 bash에 고유하며 일부 셸에서는 사용할 수 없습니다.

UNIX 의 Solaris 에는, UNIX 의 .nohup실행 중인 프로세스에 적용할 수 있는 명령어 자체:

nohup -p pid

http://en.wikipedia.org/wiki/Nohup 를 참조해 주세요.

노드의 답변은 매우 훌륭하지만 stdout과 stderr을 리다이렉트하는 방법은 아직 의문으로 남아 있습니다.Unix & Linux에서 솔루션을 찾았지만, 아직 완전하지 않습니다.저는 이 두 솔루션을 통합하고 싶습니다.여기 있습니다.

테스트를 위해 loop.sh이라고 하는 작은 bash 스크립트를 만들었습니다.이 스크립트는 무한 루프에 1분간의 sleep을 포함한 pid를 인쇄합니다.

$./loop.sh

PID가 되다.은 ★★★ps -C loop.sh괜찮지만 제 경우에는 인쇄되어 있습니다.

이제 다른 단말기로 전환할 수 있습니다(또는 같은 단말기에서 ^Z를 누릅니다)., 이제gdb이 프로세스에 첨부해야 합니다.

$ gdb -p <PID>

스크립트가 정지합니다(실행하고 있는 경우).할 수 .ps -f <PID>서 는, 「」입니다STAT ^경우)로는 (ps(1)의 경우 T+(^Z 'T'의 경우)이다(man ps(1)).

    T Stopped, either by a job control signal or because it is being traced
    + is in the foreground process group

(gdb) call close(1)
$1 = 0

Close(1)는 성공 시 0을 반환합니다.

(gdb) call open("loop.out", 01102, 0600)
$6 = 1

Open(1)은 성공하면 새 파일 기술자를 반환합니다.

이 오픈은 와 동등합니다.open(path, O_TRUNC|O_CREAT|O_RDWR, S_IRUSR|S_IWUSR)O_RDWR O_WRONLY수 , " " "는 " " 입니다./usr/sbin/lsof '라고 합니다('std*'는 'u'로 되어 있습니다).FD즉, "column" 입니다.O_RDWR.

/usr/include/bits/fcntl.h 헤더 파일의 값을 확인했습니다.

은, 「Drughta」로 열수 있습니다.O_APPEND ~로nohup 한데,요.man open(2)NFS nfs nfs nfs nfs nfs nfs nfs nfs nfs 。

-1이 .call perror("")에러 메시지를 출력합니다.가 errno 를 사용합니다.p errnogdb " "

이제 새로 리디렉션된 파일을 확인할 수 있습니다. /usr/sbin/lsof -p <PID>★★★★

loop.sh <PID> truey    1u   REG   0,26        0 15008411 /home/truey/loop.out

따라 를 다른로 리다이렉트 할 , stderr을 사용하려면 stderr을 다른 파일로 리다이렉트 할 .call close(2) ★★★★★★★★★★★★★★★★★」call open(...)하다

첨부한 ★★★★★★★★★★★★★★★★★bash를 해제해야 , 「종료할 수 .」gdb:

(gdb) detach
Detaching from program: /bin/bash, process <PID>
(gdb) q

가 에 의해 gdb하다 화면에 아무것도 쓰지 이제 화면에 아무것도 쓰지 않고 실행 및 파일에 씁니다.뒤에 붙여야 돼요. ★★★★★★★★★★★★★★★★★★★★★★★★★^Z

^Z
[1]+  Stopped                 ./loop.sh

는 (과) 같은 있습니다.^Z를 처음에 눌렀습니다.)

이제 작업 상태를 확인할 수 있습니다.

$ ps -f 24522
UID        PID  PPID  C STIME TTY      STAT   TIME CMD
<UID>    <PID><PPID>  0 11:16 pts/36   S      0:00 /bin/bash ./loop.sh
$ jobs
[1]+  Stopped                 ./loop.sh

따라서 프로세스는 백그라운드에서 실행되고 단말기에서 분리되어야 합니다.jobs각 괄호 안의 명령어 출력은 내부 작업을 나타냅니다.bash다음과 같은 빌트인에서 사용할 수 있습니다.bash작업 번호 앞에 '%' 기호를 적용하는 명령:

$ bg %1
[1]+ ./loop.sh &
$ disown -h %1
$ ps -f <PID>
UID        PID  PPID  C STIME TTY      STAT   TIME CMD
<UID>    <PID><PPID>  0 11:16 pts/36   S      0:00 /bin/bash ./loop.sh

이제 전화 통화는 그만하자.프로세스는 백그라운드에서 계속 실행됩니다.PPID를 종료하면 1(init(1) 프로세스)이 되고 제어 단말기를 알 수 없게 됩니다.

$ ps -f <PID>
UID        PID  PPID  C STIME TTY      STAT   TIME CMD
<UID>    <PID>     1  0 11:16 ?        S      0:00 /bin/bash ./loop.sh
$ /usr/bin/lsof -p <PID>
...
loop.sh <PID> truey    0u   CHR 136,36                38 /dev/pts/36 (deleted)
loop.sh <PID> truey    1u   REG   0,26     1127 15008411 /home/truey/loop.out
loop.sh <PID> truey    2u   CHR 136,36                38 /dev/pts/36 (deleted)

댓글

gdb는 명령어를 포함하는 파일(예를 들어 loop.gdb)을 생성하는 것을 자동화하고 실행할 수 있습니다.gdb -q -x loop.gdb -p <PID>my loop.gdb는 다음과 같습니다.

call close(1)
call open("loop.out", 01102, 0600)
# call close(2)
# call open("loop.err", 01102, 0600)
detach
quit

또는 다음 라이너 하나를 대신 사용할 수 있습니다.

gdb -q -ex 'call close(1)' -ex 'call open("loop.out", 01102, 0600)' -ex detach -ex quit -p <PID>

이것이 솔루션에 대한 꽤 완전한 설명이었으면 합니다.

심플하고 간단한 순서

  1. Ctrl + Z------------> 프로세스를 일시 정지합니다.
  2. bg---------------------------------------------> 백그라운드를 재개
  3. disown %1-------------------------------------------------------------------

실행 중인 프로세스를 nohup으로 전송하려면(http://en.wikipedia.org/wiki/Nohup)

nohup -p pid, 그것은 나에게 효과가 없었다.

그리고 다음 명령을 시도해보니 매우 잘 작동했습니다.

  1. SOME COMMAND를 실행합니다./usr/bin/python /vol/scripts/python_scripts/retention_all_properties.py 1.

  2. Ctrl+Z 프로그램을 중지(정지)하고 쉘로 돌아갑니다.

  3. bg백그라운드에서 실행할 수 있습니다.

  4. disown -h터미널이 닫혔을 때 프로세스가 중단되지 않도록 해야 합니다.

  5. 유형exit이제 작업이 백그라운드에서 실행되므로 셸에 얽매이지 않기 때문에 셸에서 벗어날 수 있습니다.

이 프로세스는 실행과 동일합니다.nohup SOMECOMMAND.

  1. ctrl + - 작업이 일시 중지됩니다(취소되지 않음).
  2. bg- 그러면 작업이 백그라운드에서 실행 중인 프로세스로 돌아갑니다.
  3. disown -a- 이렇게 하면 작업이 포함된 첨부 파일이 모두 절단됩니다(단말기를 닫고 계속 실행할 수 있습니다).

이러한 간단한 절차로 프로세스를 실행하면서 터미널을 닫을 수 있습니다.

붙일 수 없다nohup(당신의 질문에 대한 제 이해에 따르면, 당신은 여기에 그것이 필요하지 않습니다.)

내 AIX 시스템에서,

nohup -p  processid>

이거 잘 됐다.터미널 창을 닫은 후에도 프로세스가 계속 실행되었습니다.기본 셸로서 ksh가 있기 때문에bg그리고.disown명령어가 작동하지 않았습니다.

언급URL : https://stackoverflow.com/questions/625409/how-do-i-put-an-already-running-process-under-nohup

반응형