0

このスレッドは約2つの質問です...

私の一部は次のmakefileとおりです。

list:       all
            while IFS= read -r f; \
            do \
                ./analyze $$f & \
            done < list.txt

list.txtファイル名のリストを含み、リストを調べて各ファイルmake listに適用します。./analyze

make list > output.txtに印刷するものすべてを記録するためによく使用しstdoutます。この場合、ターミナルには何も表示されません。

しかし、実行を中断できないことに気付きました。Ctrl+CCtrl+D、またはを試しCtrl+Zましたが、PC がクラッシュしたように見え、何もできません。

私が今気づいた理由は、以前は の呼び出しの周りにタイマーがあったからです./analyze。コードは

list:       all
            while IFS= read f; \
            do \
                ./analyze $$f & \
                PID=$$!; \
                (sleep 3; kill $$PID) & \
                wait $$PID; \
            done < list.txt
            sleep 3

次に、ファイルの呼び出しが 3 秒以上かかると、呼び出しが停止され、次のファイルが続行されます。ターミナルでは/bin/bash: line 8: kill: (2970) - No such process、通話時間が 3 秒未満の場合と 3 秒/bin/bash: line 9: 2973 Terminated ./analyze $f以上の場合のリストが表示されます。実行全体をCtrl+C(数回) 中断することができ、出力を に書き込むことができますoutput.txt

これで、タイマーが不要になったことに気付きました。だから私の質問は:

1)makefileタイマーまたは私の OCaml コードを使用せずに変更./analyzeして、中断できるようにするにはどうすればよいですか。

2) の場合make list > output.txt、実行中にターミナルに簡単な情報を出力して、進行状況を確認するにはどうすればよいですか?

4

1 に答える 1

1

そのアンパサンド文字を取り除く必要があります。

list:       all
            while IFS= read -r f; \
            do \
                ./analyze $$f & <--- *** THIS ONE ***
            done < list.txt

バックグラウンドで起動するようにシェルに指示するためanalyzeです(そしてスクリプトを続行します)。これが ctrl-C で中断できない理由analyzeであり、おそらくその出力をリダイレクトできない理由でもあります (analyzeプロセスが出力を書き込む前に make コマンドが終了します)。

于 2015-02-07T01:15:48.300 に答える