$PID_PARENT
시작된 경우 , 종료해도 아무 일도 없었던 것처럼 계속 실행 되도록 $PID_CHILD
어떻게 분리( disown
?) 할 수 있습니까?$PID_CHILD
$PID_PARENT
$PID_PARENT
$PID_CHILD
구체적으로 my $PID_PARENT
는 실행 중인 프로세스 Jenkins
(또는 Java
Jenkins를 실행하는 서버를 실행하는 프로세스) $PID_CHILD
이며정말 길다Jenkins를 다시 시작한 후 작업을 다시 시작하고 싶지 않습니다(일부 유지 관리에 필요함). 본질적으로 Jenkins를 중지하고 싶지만 시작된 장기 작업은 아니며 두 PID를 모두 알고 있습니다.
업데이트 1:로그인 셸에서 disown
이것을 찾아서 시도했습니다 (부모 PID 셸이 아님).
disown $PID_CHILD
하지만 얻었어
-bash: disown: 13924: no such job
옳은 $PID_CHILD
일
ps -o ppid= $PID_CHILD
반품$PID_PARENT
업데이트 2:@Rui에 따르면답변, Jenkins에서 임시 해킹 작업을 수행했습니다. 이번에는 상위 셸에서 실행했습니다.
disown 13924
하지만 아직있어
disown: 13924: no such job
답변1
한 가지 방법은 상위 프로세스에서 하위 프로세스를 분리하는 것입니다. 이것은 것이다하위 프로세스에 적절한 코드가 필요합니다., 또는 실제 코드를 실행하기 전에 연결 해제 래퍼 스크립트를 실행합니다.
#!/usr/bin/env perl
use strict;
use warnings;
die "Usage: $0 command [args ..]\n" unless @ARGV;
# diassociate this process (some folks also do a double-fork thing)
use POSIX "setsid";
chdir("/") || die "can't chdir to /: $!";
open( STDIN, "< /dev/null" ) || die "can't read /dev/null: $!";
open( STDOUT, "> /dev/null" ) || die "can't write to /dev/null: $!";
defined( my $pid = fork() ) || die "can't fork: $!";
exit if $pid; # non-zero now means I am the parent
( setsid() != -1 ) || die "Can't start a new session: $!";
open( STDERR, ">&STDOUT" ) || die "can't dup stdout: $!";
# and replace ourself with whatever we were called with
exec @ARGV;
다른 이름으로 저장한 경우 다음을 solitary
통해 테스트할 수 있습니다.
% ./solitary logger greppable
% grep greppable /var/log/system.log
Jun 27 10:52:15 hostn jhqdoe[20966]: greppable
%
logger(1)
연결 해제의 일부로 표준 파일 핸들이 모두 닫혔기 때문입니다 . 애플리케이션의 다른 곳으로 리디렉션해야 할 수도 있습니다.
Jenkins(또는 systemd 등)가 PID 네임스페이스를 사용하는 경우 프로세스는 분기 방법에 관계없이 탈출할 수 없으며 불가능할 수 있습니다. 이 경우 컨테이너 수준 솔루션이 필요하거나 시도 중인 것을 다시 방문하십시오. 할 것.
답변2
나는 당신이 간단하게 할 수 있어야한다고 생각합니다
$ disown $PID
그런 다음 셸 세션을 종료해도 프로세스는 계속 실행됩니다.
답변3
disown
프로세스를 호출한 셸에서 작업을 수행 해야 합니다 . 따라서 다른 쉘에서 호출하면 메시지를 받게 됩니다 no such job
.
실제로 프로세스를 거부하고 중단 신호를 무시하도록 지시하려면 프로세스를 호출한 셸에서 다음을 수행할 수 있습니다.
disown -h $PID
부인 도움말에서:
$ disown --help disown: disown [-h] [-ar] [작업 사양... pid ...]
현재 쉘에서 작업을 제거합니다.Removes each JOBSPEC argument from the table of active jobs. Without any JOBSPECs, the shell uses its notion of the current job. Options: -a remove all jobs if JOBSPEC is not supplied -h mark each JOBSPEC so that SIGHUP is not sent to the job if the shell receives a SIGHUP -r remove only running jobs Exit Status: Returns success unless an invalid option or JOBSPEC is given.
답변4
Jenkins 빌드가 완료된 후에도 유지되는 백그라운드 프로세스를 생성할 때는 주의해야 합니다.젠킨스 프로세스 트리 킬러. 빌드가 종료되면 Process Tree Killer는 빌드와 관련된 모든 프로세스를 종료하려고 시도합니다. 이는 해당 프로세스가 더 이상 빌드 프로세스의 일부가 아니고 더 이상 빌드 프로세스의 하위 프로세스가 아니더라도 마찬가지입니다.
위 링크에는 특정 작업이나 전체 Jenkins에 대해 프로세스 트리 킬러를 비활성화하는 방법에 대한 지침이 있습니다.