したがって、問題は遅いインターネット接続に起因し、「apt-get update」(debian)を実行しようとすると問題が発生します。 apt-getは4つの小さなデータチャンクを取得し、1つの大きなデータチャンクを取得しようとします。約5分後に25%完了したら、そのチャンクダウンロードを放棄し、より大きな代替データをインポートしようとします。 5分後に20%が完了したらあきらめ、より大きな代替案を試み、5分後に10%が完了したらあきらめて必要なものを手に入れることができないと文句を言います。 「apt-get update」を再度実行しようとすると、4つの小さなチャンクを再度プルダウンし、中断された部分から3つの大きなチャンクを処理し続けます。 aptのhttp::Timeoutとftp::Timeoutの設定を調べて試してみましたが、この状況を処理できる設定がないようです。私の現在のアプローチは、この問題を処理して試みるたびに追加の10分を無駄にしないように、代替を適用しながらCtrl-Cを押すことです。一人で子供たちの世話をすることができるようにしたいです。
私が念頭に置いているのは、次のシェルスクリプトです。
タイムアウト、sudo apt-getアップデートで起動し、いつでもapt-getが正常に完了したらすぐにsudo apt full-upgradeを続行し、最終的に終了しますが、その間にapt-getが画面に1行を印刷すると「Ign:」テキストを使用してpkill aptを実行し、有効期限が30分未満の場合はsudo apt-get updateで再起動し、そうでなければ「今はApt-updateを完了できません!」をechoして終了します。
私が知りたいのは、bashスクリプトが実際にこのようなことをすることができるということです。その場合は、検索を開始するコマンドのヒントが役に立ちます。 apt-getの確認と実行は両方のプロセスで行わなければならないと思いますが、あるプロセスが他のプロセスの画面出力と終了状態をどのように確認できるかわかりません。 Bashスクリプトがこれを実行できない場合は、他のどのツールを調べるべきかわかりません。 Pythonはこれを行うことができますか?
答え1
これには複雑な問題があります。
- プログラムが画面に印刷する内容をスクリプトで監視できますか?
はい、strace
可能です。
strace -p<process id> -s1000 -e write
これは、プロセスIDに属するプロセスが何を書いているかを監視し、出力をデフォルトの32文字から1000文字に増やします。
- コマンドが文字列を出力するときに何ができますか?
これは非常に簡単で、正しい方向に進むのに役立ちます。
<command-you-want-to-watch> | tee file_to_watch
tee
ファイルだけでなく画面にも出力されます。それにもかかわらず、通常、画面で発生する素晴らしいオーバーレイの一部が表示されない場合があります。ビューに興味がない場合は、出力をファイルにリダイレクトできます<command> >file
。
オブザーバースクリプト:
#!/bin/bash
while true; do
if grep -q "phrase1" file_to_watch; then
#do stuff
break
fi
if grep -q "phrase2" file_to_watch; then
#do stuff
break
fi
sleep 1
done
これは毎秒ファイルでフレーズをチェックし、必要に応じて実行してから終了します(これらのbreak
ステートメントは無限ループを終了します)。