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

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

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

答え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全体のプロセスツリーキラーを無効にする方法についての指示があります。

関連情報