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
두 가지 질문이 있습니다:
- 스크립트는 비대화형 하위 쉘(상위 쉘과 다름)에서 실행됩니다.
- 서브쉘에 대한 작업 제어는 없습니다.
단순히 서브셸에서 작업 제어를 활성화하기 위해 스크립트를 실행하는 것은 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파일이 비어 있게 됩니다.