Daemonize ? nohup ? SCREEN ? (tmux ftw, screen est de la camelote ;-)
Faites juste ce que toutes les autres applications ont fait depuis le début : une double fourchette.
# ((exec sleep 30)&)
# grep PPid /proc/`pgrep sleep`/status
PPid: 1
# jobs
# disown
bash: disown: current: no such job
Bang ! C'est fait :-) J'ai utilisé cette méthode d'innombrables fois sur tous les types d'applications et sur de nombreuses vieilles machines. Vous pouvez combiner avec des redirections et autres pour ouvrir un canal privé entre vous et le processus.
Créer comme coproc.sh :
#!/bin/bash
IFS=
run_in_coproc () {
echo "coproc[$1] -> main"
read -r; echo $REPLY
}
# dynamic-coprocess-generator. nice.
_coproc () {
local i o e n=${1//[^A-Za-z0-9_]}; shift
exec {i}<> <(:) {o}<> >(:) {e}<> >(:)
. /dev/stdin <<COPROC "${@}"
(("\$@")&) <&$i >&$o 2>&$e
$n=( $o $i $e )
COPROC
}
# pi-rads-of-awesome?
for x in {0..5}; do
_coproc COPROC$x run_in_coproc $x
declare -p COPROC$x
done
for x in COPROC{0..5}; do
. /dev/stdin <<RUN
read -r -u \${$x[0]}; echo \$REPLY
echo "$x <- main" >&\${$x[1]}
read -r -u \${$x[0]}; echo \$REPLY
RUN
done
et ensuite
# ./coproc.sh
declare -a COPROC0='([0]="21" [1]="16" [2]="23")'
declare -a COPROC1='([0]="24" [1]="19" [2]="26")'
declare -a COPROC2='([0]="27" [1]="22" [2]="29")'
declare -a COPROC3='([0]="30" [1]="25" [2]="32")'
declare -a COPROC4='([0]="33" [1]="28" [2]="35")'
declare -a COPROC5='([0]="36" [1]="31" [2]="38")'
coproc[0] -> main
COPROC0 <- main
coproc[1] -> main
COPROC1 <- main
coproc[2] -> main
COPROC2 <- main
coproc[3] -> main
COPROC3 <- main
coproc[4] -> main
COPROC4 <- main
coproc[5] -> main
COPROC5 <- main
Le <( :) ouvre un tube anonyme via la substitution de processus, qui meurt, mais le tube reste là parce que vous avez un handle sur lui. Je fais habituellement un sleep 1
au lieu de :
parce que c'est un peu osé, et j'obtiendrais une erreur "fichier occupé" -- cela n'arrive jamais si une vraie commande est lancée (ex, command true
)
"heredoc sourcing" :
. /dev/stdin <<EOF
[...]
EOF
Cela fonctionne sur tous les shells que j'ai essayés, y compris busybox/etc (initramfs). Je ne l'ai jamais vu faire avant, je l'ai découvert indépendamment en poussant, qui savait que source pouvait accepter des args ? Mais cela sert souvent comme une forme beaucoup plus facile à gérer de eval, si une telle chose existe.
0 votes
Si vous voulez forcer la session à rester ouverte, voir stackoverflow.com/questions/25084288/keep-ssh-session-alive