Одним из способов является отсоединение дочернего процесса от родительского. Для этого потребуется соответствующий код в дочернем процессе или сценарий-оболочка, который выполняет отсоединение перед выполнением реального кода :
.
#!/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, которое процесс не может избежать, независимо от того, как он разветвляется, и в этом случае вам понадобится некоторый уровень контейнера -. решение или вернуться к тому, что вы пытаетесь сделать.
Вы наверняка не сможете запустить KDE или Gnome из среды Javascript. Но существуют некоторые настольные проекты Javascript (, такие как тот, который вы можете увидеть в FreeboxOS ).
Взгляните, например, на OS.js:https://demo.os-js.org/
С уважением и удачи в интеграции.