SSHを介してリモートホストに接続し、一時ファイルを生成し、次のコマンドを実行するスクリプトがあります。
システムコール(mysql --database=information_schema --host=localhost < /tmp/drush_1JAjtt)
毎回別のファイルを作成します(モード:)drush_xxxxxx
。
リモコンで手動で数回実行してみました。
tail -f /tmp/drush_*
しかし、接続が遅すぎて、ほとんどの場合エラーが発生します。
尾: `/tmp/drush_*'を読むために開くことができません:そのファイルまたはディレクトリがありません
そのファイルを作成したらすぐにアクセスしてコンテンツを表示する方法はありますか?
答え1
この問題が発生したとき特定アプリケーションの動作確認私はそれを信頼しません。アプリケーションは一時ファイルを作成して削除します。 ノブのソリューション大丈夫ですが、これを使用するとcat
競合状態が発生する可能性があります(つまり、操作中にファイルがcat
削除される可能性があるため、データの一部のみが取得されます)。
ファイル自体へのハードリンクを作成すると、競合状態が発生する可能性を減らすことができます。grep
ハードリンクの作成と作成はを介して組み合わせることができますawk
。それで私は次のことを思い出しました。
inotifywait -e create -m --format "%w/%f" /tmp/suspicious_dir/ 2>&1 |
awk 'NR>2{n=split($0,a,"/");system("ln "$0" /tmp/hardlink_to_"a[n]);}'
フラグを使用しているため、-e create
すぐに生成される一時ファイルにのみ興味があり、出力形式は生成される一時ファイルへのフルパスを提供します。渡された出力の最初の2行を無視しますNR>2
。報告された各ファイルに対して、ハードリンクは次の形式で生成されます。/tmp/hardlink_to_<original filename>
答え2
inotify
(inotify-tools
on)を使用するスクリプトを設定し、Debian
特定のディレクトリ内のファイルから変更を検索することができます。次に、ファイル名をフィルタリングしてcat
ログファイルに保存します。
答え3
drushは、次の2つの方法のいずれかでこの一時ファイルを使用できます。
- ファイルを作成した後にユーザーに残すことです。
- ファイルを作成し、それをクリーンアップします。
私の考えでは、(1)の場合は、事実の後にファイルを手動でスキャンすることができるので、問題はありません。その後、問題は短い寿命で一時ファイルを確認したいということです。
外部プロセスを使用して一時ファイルを監視することは非常に効果的です。もちろん、これは一時ファイルの持続時間(5ms〜500ms〜5秒〜5分?)と監視システムの応答速度によって異なります。
別の方法は、「mysql」コマンドを使用して関心のあるデータを記録することです。たとえば、「mysql」が「/usr/bin/mysql」にある場合は、「/usr/local/」bin/mysql」ファイルを作成できます。
#!/bin/bash
LOG=/tmp/mysql-commands
REALCMD=/usr/bin/mysql
NOW=$(date)
echo "[[$NOW: Running: $REALCMD $@]]" >> "$LOG"
tee -a "$LOG" | "$REALCMD" "$@"
exit $?
答え4
ファイルが短時間で生成された場合は、スクリプトを実行する前に別の端末で次のコマンドを実行できます。
while true; do cat /tmp/drush_* 2>/dev/null && break; done
/tmp/drush_*
あなたのパターンはどこにありますか?利点は、高速で外部ツールをインストールする必要がないことです(管理者/ルート権限がない場合)。
この特別なケースでは、時計を配置した後にファイルが生成され、変更が検出されないため、inotifywatch
(from)ツールを使用すると機能しません。inotify-tools
もっと読む:inotifyが変更されたファイルのリストを印刷しないのはなぜですか?
inotifywait
ただし、Linuxのinotifyインターフェースを使用してファイルの変更を効果的に待機するツールを引き続き使用できます。
簡単な例は次のとおりです。
inotifywait -m --format "%e %f" /tmp
そして、例は新しく作成されたファイルの内容を示しています/tmp
。
inotifywait -m --format "%f" /tmp | grep --line-buffered ^drush | xargs -L1 -I% cat /tmp/% 2> /dev/null
必要に応じてsudo
前に追加してください。あなたに合わせてcat
変化し/tmp
、価値を与えてください。drush