一時ファイルを作成した後に直接アクセスするにはどうすればよいですか?

一時ファイルを作成した後に直接アクセスするにはどうすればよいですか?

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

inotifyinotify-toolson)を使用するスクリプトを設定し、Debian特定のディレクトリ内のファイルから変更を検索することができます。次に、ファイル名をフィルタリングしてcatログファイルに保存します。

答え3

drushは、次の2つの方法のいずれかでこの一時ファイルを使用できます。

  1. ファイルを作成した後にユーザーに残すことです。
  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

関連情報