이미 실행 중인 프로세스를 nohup에 넣는 방법은 무엇입니까?
이미 장시간 진행 중인 프로세스가 있어 종료하고 싶지 않습니다.
nohup(단말기를 닫아도 계속 작동시키는 방법)으로 하려면 어떻게 해야 합니까?
bash의 Job Control을 사용하여 프로세스를 백그라운드로 전송합니다.
- Ctrl+Z 프로그램을 중지(정지)하고 쉘로 돌아갑니다.
bg
이치노disown -h [job-spec]
여기서 번호입니다(예: [job-spec]).%1
중인 의 경우, "", "번호 검색", "번호 검색", "번호 검색"jobs
command를 사용하면 터미널이닫혔을 때 되지 않습니다.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 errno
gdb " "
이제 새로 리디렉션된 파일을 확인할 수 있습니다. /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>
이것이 솔루션에 대한 꽤 완전한 설명이었으면 합니다.
심플하고 간단한 순서
Ctrl + Z
------------> 프로세스를 일시 정지합니다.bg
---------------------------------------------> 백그라운드를 재개disown %1
-------------------------------------------------------------------
실행 중인 프로세스를 nohup으로 전송하려면(http://en.wikipedia.org/wiki/Nohup)
nohup -p pid
, 그것은 나에게 효과가 없었다.
그리고 다음 명령을 시도해보니 매우 잘 작동했습니다.
SOME COMMAND를 실행합니다.
/usr/bin/python /vol/scripts/python_scripts/retention_all_properties.py 1
.Ctrl+Z 프로그램을 중지(정지)하고 쉘로 돌아갑니다.
bg
백그라운드에서 실행할 수 있습니다.disown -h
터미널이 닫혔을 때 프로세스가 중단되지 않도록 해야 합니다.유형
exit
이제 작업이 백그라운드에서 실행되므로 셸에 얽매이지 않기 때문에 셸에서 벗어날 수 있습니다.
이 프로세스는 실행과 동일합니다.nohup SOMECOMMAND
.
- ctrl + - 작업이 일시 중지됩니다(취소되지 않음).
bg
- 그러면 작업이 백그라운드에서 실행 중인 프로세스로 돌아갑니다.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
'programing' 카테고리의 다른 글
NSLog에서 사용하는 "toString()"에 대한 Objective-C는 무엇입니까? (0) | 2023.04.23 |
---|---|
WebForms UntruptiveValidationMode를 사용하려면 'jquery'를 위한 ScriptResourceMapping이 필요합니다.jquery(대문자와 소문자가 구분됨)라는 이름의 ScriptResourceMapping을 추가하십시오. (0) | 2023.04.23 |
비동기 코드에서 비동기 메서드를 호출합니다. (0) | 2023.04.23 |
VBA를 사용하지 않고 Excel에서 역문자열 검색을 실행하는 방법은 무엇입니까? (0) | 2023.04.23 |
T-SQL에는 문자열을 연결하는 집약 기능이 있습니까? (0) | 2023.04.23 |