親プロセスから子プロセスを切断します。

親プロセスから子プロセスを切断します。

$PID_PARENT開始された場合、終了しても何もなかったかのように継続実行されるようにどのように$PID_CHILD分離 ( disown?) できますか?$PID_CHILD$PID_PARENT$PID_PARENT$PID_CHILD

具体的には、my$PID_PARENTは実行中のプロセスJenkins(またはJavaJenkinsを実行しているサーバーを実行するプロセス)です$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

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名前空間を使用している場合、プロセスは分岐方法に関係なくエスケープできず、不可能になる可能性があります。この場合は、コンテナレベルのソリューションが必要か、試しているものをもう一度参照してください。すること。

おすすめ記事