2017-06-10 6 views
-1

私たちは多くの*サブシステムを管理および制御する組み込みLinuxを持っています。また、ケーブルなしで通信できる通信媒体(Sバンド)もあります。 現在、私は運用期間中に使用できるスクリプトを扱っています。Linuxでスリープメカニズムがどのように機能するか

時計のプロトタイプです。クロックが00:00のときにスクリプトを有効にすることができます。

while [ 1 ]; 
do 
    curHour="$(date +%H)" 
    curMin="$(date +%M)" 
    echo $curHour:$curMin 
    if ((10#$curHour=="0")); then 
     if((10#$curMin=="0"));then 
      ./archAndComp.sh 
     fi 
    fi 
    sleep 60 
done 

私が呼び出すスクリプトには、目的のディレクトリをアーカイブして圧縮する特定のジョブがあります。ここに私が説明したもののプロトタイプがあります。

dirName="logs" 
j=0 
if (find $PWD $dirName*); then 
    i=0 
    while (find $PWD $dirName-$i.tar.xz); 
    do 
     let i++ 
    done 
    tar -cvf $PWD/$dirName-$i.tar $PWD/var/log/$dirName 
    xz $PWD/$dirName-$i.tar 
else 
    tar -cvf $PWD/$dirName-$j.tar $PWD/var/log/$dirName 
    xz $PWD/$dirName-$j.tar 
fi 

要約すると、毎日の終わりに、特定のディレクトリをアーカイブして圧縮したいと思います。ファイル転送/ダウンロードスクリプトが提供されています。したがって、その部分を議論する必要はありません。

私がバグするものは、 timer.shスクリプトがアクティブな場合、他のプロセスが完了しないようにプロセスがスリープしますか?代わりに、ある内部スケジューラは、sleepをスレッドのような仕組みに割り当てて、他のプロセスの寿命を延ばすことができます。

最初のケースでは、私はタイマスクリプトをデーモン化する必要があります。あなたの提案は何ですか、私はsystemdに固執するか、自分の時計のようなデーモンを実装しますか?

+7

通常、スリープはCPUを大量に消費するものではありません。スケジューラは、奇妙な設定がない限り、他のプロセスを実行させる可能性があります。つまり、毎日これを実行するために 'cron 'を使用するだけではどうですか?毎回頻繁に物を動かすことは、正確にそれがそこにあるのです –

答えて

1

Eric Renoufはポイントを持っています。組み込みシステムのメモリが本当にきつい場合を除き、cronは定期的に他のプロセスの実行をスケジュールするうまい方法です。しかし、あなたがbashの解決策に固執することに決めたら、いくつかのヒントがあります。

カスタムではwhile trueが無限ループに使用されます。いくつかの技術的な詳細が隠されているため、while [1]よりやや良いかもしれません。次のように少し良くなっています。文字通り数CPUサイクルの余裕があります。だから、それはあまり気にしません。

プロセスを実行する時間が到着したかどうかを確認するには、非常に精巧な方法を選択してください。

if [ "$(date +%H%M)" = "0000" ]; then 
    ./do-something.sh 
fi 

60秒ごとに時刻を確認する必要はありません。あなたは深夜まで、現在の時間と睡眠を確認することができます。

while true; do 
    t=($(date +"%H %M %S")) # store current hh:mm time into an array 
    if [ "${t[0]}${t[1]}" = "0000" ]; then 
    ./do_something.sh  # it could be a time consuming process 
    t=($(date +"%H %M")) # so we want to know when it ends 
    fi 
    # sleep till next midnight 
    sleep $[ 86400 - 3600 * ${t[0]} - 60 * ${t[1]} - ${t[2]} ] 
done 

あなたは、バックグラウンドでスクリプトを呼び出したいことがあります。また

./my_scheduler.sh & 

は、あなたがから呼び出されたものは何でもからのログを保存しておきたいことあなたのスケジューラの内部:

./do_something.sh > /log/something.log 2>&1 

そして、あなたの元の質問については:のbashから睡眠はsleep(3)システムコールを使用して実装されています。多かれ少なかれ、スケジューラ(プロセス/スレッドにCPU時間を割り当てるタイミングを決めるカーネルサブシステム)を意味します。指定された時間が経過するか特別なことが起こらない限り、私を実行しないでください。したがって、スリーププロセスはCPUリソースを消費しません。

+0

詳細な応答をありがとう。 – Elesmoth

関連する問題