사실 이런 종류의 다른 대답 할 수있는 방법을 정확하게 보여 여기 . 그 대답은 백그라운드 프로세스로 2 개의 로그를 유지 관리하는 것에 관한 질문에 대한 것이므로 10으로 표시했습니다.
데모 스크립트
cat <<-\DEMO >|${s=/tmp/script}
printf 'tty is %s\nparent pid is %s\npid is pid=%s\n' \
"$(tty)" "$PPID" "$$"
exec 1>&2 ; nums=$(seq 0 9)
rm ${files=$(printf "/tmp/file%s\n" $nums)}
for n in $nums ; do { for f in $files ; do
echo "Line $n" >>"$f" ; done
sleep 1 ; } ; done
#END
DEMO
데모 실행
s=/tmp/script ;chmod +x $s ;info="$(($s &)2>&- &)"
echo "$info" ; pid="${info##*=}" ; echo
while ps -p $pid >/dev/null ; do sleep 3 ; done
for f in /tmp/file[0-9] ; do
printf 'path : %s\tline count : %s\n' \
$f $(<$f wc -l)
done
산출:
tty is not a tty
parent pid is 1
pid is 12123
path : /tmp/file0 line count : 10
path : /tmp/file1 line count : 10
path : /tmp/file2 line count : 10
path : /tmp/file3 line count : 10
path : /tmp/file4 line count : 10
path : /tmp/file5 line count : 10
path : /tmp/file6 line count : 10
path : /tmp/file7 line count : 10
path : /tmp/file8 line count : 10
path : /tmp/file9 line count : 10
이상이 설명합니다. 그것은 구축하고라는 이름의 스크립트가 실행 /tmp/script
, chmod
의 실행 파일로하고, 그것을 실행 &background
의 &backgrounded ( subshell )
.
스크립트는 rms /tmp/file0-9
10 개의 파일과 10 개의 echoes
줄을 1 초마다 한 줄씩 만듭니다. 사용하지 않는 $info
프로세스에서 일부 를 캡처하여 캡처 $(command substitution). While ps
에 대한 스틸 보고서를 통해 표시 $pid
합니다. 여전히 실행되고 있다는 것을 알고 sleep.
있습니다. 완료되면 10 개 파일의 행이 모두 계산됩니다.wc.
이러한 방식으로 프로세스를 호출 한 후에는 원래 상위 프로세스를 자유롭게 닫을 수 있으며 계속 트럭 킹을 계속할 수 있습니다. 이것은 또한 일반적인 wait
명령을 사용할 수는 없지만 ps
의 반환 대기는 더 강력해야합니다.
언급 할만큼 가치, 내가 생각하는 과정이 실제로 처음에 호출 될 것입니다 $(command substitution)
그리고 printfs
나는 $info
내가 효과적으로 제어 할 수 있도록 내가 할 수 있습니다. 하지만 그것의 출력 단자를 삭제 자마자 exec 1>&2
(어느 것이 서브 쉘과 같은 폐쇄되고 2>&-
), 처리는 탈출 I의 타단에 대해 주위를 기다려야한다. 모든 경로 재 지정 및 프로세스 리더에 대해 마음을 감쌀 수있는 한, 특히 파이프를 사용하여 입력 파이프를 처리하는 경우 두 가지 이점을 모두 활용하십시오.
다른 모든 것들은 여기서 시연하기위한 것입니다. 이 스크립트를 실행하기 위해 필요한 것은 다음과 같습니다.
info="$(($script_path &)2>&- &)"
참고 : 이것은 내가 보여주고 싶었던 것과 정확하게 터미널에만 인쇄합니다. $PPID,
이 프로세스에서언급했듯이이 프로세스는 터미널에서 제외되며$PID 1.
이 두 가지를 동시에 실행하고 기다리려면 ps
두 pid를 모두주고 기다릴 수 있습니다.