daemonize? поЬир? SCREEN? (tmux ftw, screen is ununk ;-)
Просто делайте то, что делали все другие приложения с самого начала - двойная вилка.
# ((exec sleep 30)&)
# grep PPid /proc/`pgrep sleep`/status
PPid: 1
# jobs
# disown
bash: disown: current: no such job
Bang! Выполнено :-) Я использовал это бесчисленное количество раз для всех типов приложений и многих старых машин. Вы можете комбинировать с переадресацией и еще не открывать частный канал между вами и процессом.
Создать как 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 "${@}"
(("\[email protected]")&) <&$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
, а затем
# ./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
и там вы идете, нерест бы то ни было. < (:) открывает анонимную трубу через замену процесса, которая умирает, но труба прилипает, потому что у вас есть ручка к ней. Я обычно делать sleep 1
вместо :
, потому что его немного пикантный, и я получаю «файл занят» ошибка - никогда не произойдет, если реальная команда побежала (например, command true
)
«Heredoc источников»:
. /dev/stdin <<EOF
[...]
EOF
Это работает на каждой оболочке, которую я когда-либо пробовал, включая busybox/etc (initramfs). Я никогда не видел, чтобы это делалось раньше, я самостоятельно обнаружил это, когда подталкивал, кто знал, что источник может принять аргументы? Но он часто выступает в качестве более управляемой формы eval, если есть такая вещь.
Как вы его остановите? – 2010-07-13 17:49:12
Войдите и выполните «kill». Используйте «pidof», если вы не знаете pid. –
JesperE
2010-07-13 18:01:22
Вы можете использовать `nohup command>/dev/null 2> & 1 &` для запуска в фоновом режиме без создания каких-либо выходов stdout или stderr (без файла `nohup.out`) – KCD 2013-04-01 23:03:28