주어진 대화형 bash 쉘 내에서 백그라운드에서 주기적으로 명령을 실행하도록 예약하려면 어떻게 해야 합니까?

주어진 대화형 bash 쉘 내에서 백그라운드에서 주기적으로 명령을 실행하도록 예약하려면 어떻게 해야 합니까?

cron을 통해 명령이 주기적으로 실행되도록 예약할 수 있습니다.

주어진 대화형 bash 셸 내에서 백그라운드에서 주기적으로 명령을 실행하는 방법이 궁금합니다.

  • jobs주어진 쉘의 출력 과 같이 쉘 상태를 기반으로 출력을 생성하는 명령이 필요하기 때문에 주어진 대화형 bash 쉘(실행 중인 다른 쉘이 아님)에서 이 명령을 실행하고 싶습니다 .

  • 동일한 셸에서 다른 명령을 계속 실행할 수 있기를 원하기 때문에 이 명령을 백그라운드에서 실행하고 싶습니다.

  • 명령은 스크립트일 수 있으며 스크립트가 특정 셸의 상태에 액세스하려면 source셸에 스크립트가 필요할 수 있습니다.

예를 들어:

나는 다음과 같은 스크립트의 예를 작성했습니다.

$ pwd
/tmp/test
$ cat test.sh 
#! /bin/bash

while true;
do
    dirs -l -p  > /tmp/test/dirs
    jobs > /tmp/test/jobs
    sleep 5
done

그런 다음 대화형 bash 셸에서 실행합니다.

$ source test.sh &

그러나 스크립트의 최신 출력을 가져오는 파일에는 지정된 셸에서 jobs직접 실행한 출력이 포함되어 있지 않습니다.dirs -l -p

$ evince &
$ jobs
[1]-  Running                 source test.sh &
[2]+  Running                 evince &
$ cat /tmp/test/jobs 
$

$ pushd /tmp/
/tmp /tmp/test    
$ dirs -l -p
/tmp/test
/tmp    
$ cat /tmp/test/dirs 
/tmp/test

이유를 알고 싶습니다. 이 기사의 시작 부분에 나오는 작업을 어떻게 수행할 수 있습니까?

감사해요.

답변1

두 가지 질문이 있습니다:

  1. 스크립트는 비대화형 하위 쉘(상위 쉘과 다름)에서 실행됩니다.
  2. 서브쉘에 대한 작업 제어는 없습니다.

단순히 서브셸에서 작업 제어를 활성화하기 위해 스크립트를 실행하는 것은 bash -m test.sh &작동하지 않습니다. 이는 상위 셸에서 모든 파일 설명자를 상속한다는 의미이기도 하기 때문입니다. 누르면 가장 먼저 일어나는 일은 Enter스크립트가 일시 중지된다는 것입니다.

Enter대신, "정기적으로"를 "누를 때마다 새 명령이 실행됩니다" 로 해석해 보겠습니다 .

이는 스크립트의 주요 부분을 PROMPT_COMMAND여기에 넣을 수 있음을 의미합니다. 이 변수에 값이 있으면 다음 프롬프트가 표시되기 전에 평가됩니다.

PROMPT_COMMAND='jobs >/tmp/test/jobs'

sleep 100 &프롬프트 후에 실행하고 조사하면 여기 /tmp/test/jobs에 포함된 것을 볼 수 있습니다.

[1]+  Running                 sleep 100 &

100초 후에 더 이상 백그라운드 작업이 시작되지 않으면 키를 누르면 Enter포함할 파일이 업데이트됩니다.

[1]+  Running                 sleep 100 &
[1]+  Done                    sleep 100

다음에는 Enter파일이 비어 있게 됩니다.

관련 정보