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