与えられた対話型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

2つの質問があります。

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

関連情報