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
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ファイルが空になります。