&가 주어지더라도 다른 호출된 스크립트는 백그라운드로 이동하지 않습니다.

&가 주어지더라도 다른 호출된 스크립트는 백그라운드로 이동하지 않습니다.

스크립트가 2개 있습니다.

script2, 및 명령의 조합을 사용하여 한 번에 16개의 파일을 압축하는 내부적으로 my 를 호출합니다 . 기본적으로 파일이 존재하는지 확인한 후 다음 프로세스를 실행하는 통합 파일 감시자 스크립트입니다. (크로나는 아님)sh scriptpath/script2.sh &script1findxargsgzip

인용하다:https://it.toolbox.com/question/file-watcher-script-070510

find ${Filepath}/ -maxdepth 1 -type f -name "${Pattern}" -print0 | xargs -0 -t -n 1 -P 16 gzip > /dev/null

내 스크립트 2를 호출한 후 위 명령에서 중단됩니다.

위의 명령 상태로 Script1 세션이 닫히고 script2의 쉘이 열리고 있습니다. 포그라운드가 아닌 백그라운드에서 실행하려면 두 번째 스크립트의 gzip 명령이 필요합니다.

Script1 - 여러 파일을 생성합니다. script2에서 사용할 변수 내보내기

그런 다음 script2가 호출되어 sh script2 needed parameters &(앰퍼샌드가 script2를 배경으로 푸시함) script1완료되지만 스크립트 2가 터치 파일을 찾은 후에는 완료되지 않습니다. 실행이 시작됩니다. 그러나 터치 파일이 발견되면 실행 script2프롬프트가 전면에 나타납니다.gzip

Script2를 호출하기 전에 생성된 Script2 Gunzips 파일

fileflag=0
timer1=0
check_interval=300 # check every 5 minutes
(( check_interval_minutes=${check_interval}/60 ))
while [ ${timer1} -lt 180 ]
do
if [ -f /path/to/my/file ]
then
find ${Filepath}/ -maxdepth 1 -type f -name "${Pattern}" -print0 | xargs -0 -t -n 1 -P 16 gzip > /dev/null
else
sleep ${check_interval}
fi
(( timer1=${timer1} ${check_interval_minutes} ))
done

답변1

xargs -tWrite.Yours 는 아무런 효과 stderr가 없습니다 . 따라서 백그라운드 프로세스에서 터미널에 쓰는 것은 일반적으로 나쁜 생각입니다.> /dev/nullstderr

답변2

find/gzip 프로세스가 백그라운드에서 발생하도록 하려면 다음 명령을 사용하여 백그라운드에서 전체 청크를 실행할 수 있습니다.

( find ${Filepath}/ -maxdepth 1 -type f -name "${Pattern}" -print0 | xargs -0 -t -n 1 -P 16 gzip > /dev/null ) &

그러나 이러한 모든 gzip 프로세스를 완료하는 데 걸리는 시간(현명하지 않을 수 있음)에 따라 스크립트 실행 사이의 시간보다 오래 걸리는 경우 동일한 파일을 압축하려는 여러 프로세스가 발생할 수 있습니다.

inotifywatch나타나는 파일에 대한 디렉터리를 모니터링하고 압축하는 것과 같은 방법을 사용하는 것이 더 나을 것입니다 .

관련 정보