具体的には「something」という内容のファイルを見つけるための最良かつ最速の方法を見つけようとしています。
理由は次のとおりです。PIDをファイルのどこかに保存することはほぼ確実ですが、どこにあるのかわかりません(そして知りたいのですが)。上記のpid(/var/run/myproc.pid
など)の保存に使用できるファイル名を探してみましたが、今のところ成功していません。内容がちょうどその番号のファイルを検索してみてください。 ps -aux
またはtop
、またはそのようなツールからPIDを取得し、その番号のみのコンテンツを持つファイルを検索したいと思います。
私はグーグルで探し回っていますが、すべての答えは、その内容の中に「something」...を含むファイルを見つける方法を説明しているようです。少し違うものが欲しい...その「何か」と完全に一致したい
前もって感謝します。
何かのようなもの ...
ps ax|grep ntpd|cut -b1-5|xargs -I PID find /var/run/ -type f -exec grep '-l' '^PID$' {} ';'
grep
パターンは、検索文字列がその行の唯一のものでなければならないことを指定していることに注意してください。つまり、
start(^)
string (PID is replace by value sent to `xargs`)
end($)
PS:ps ax > /var/run/psaxdump
に続いて上記を実行して、これをテストしました。 ntpd.pid
のみが見つかりました
目的のテキストをファイルに入れてから、すべての候補ファイルに対してcmp
を実行します。
pgrep myproc >/tmp/the_pid
find /var -type f -size $(wc -c </tmp/the_pid)c -exec cmp -s /tmp/the_pid {} \; -print
しかし、このユースケースでは、strace -eopen
の下で、または auditd
ルール を使用してプログラムを再起動します。
auditctl -F "ppid=$$,a2&0x100" -S open
/path/to/daemon
正規表現をgrepに渡すことができます。これを試してください:(PIDが67543であると仮定)
grep -R '^67543$' /
正規表現では、^
にんじん(sp)記号は「文字列の始まり」を意味し、$
ドル記号は「文字列の終わり」を意味するため、上記の正規表現は、ファイルが文字列「67543」で開始および終了する場合にのみ結果を返します。
find searchtree -type f -size `stat -c%s needle`c | xargs -n1 diff -s needle
インストールでpcregrepが使用可能な場合は、-l(リストファイル名)、-r(再帰)、および-M(マルチライン)フラグを渡して、ジョブを実行できます。\Aと\ Zは、文字列アンカーの開始と終了を表すことに注意してください。以下の例では、12477が検索対象の文字列です。
pcregrep -l -r -M '\A12477\Z' dir
プログラムが起動時または他の無数のプログラムと一緒に起動されていない場合、pidfileはプロセスと同じくらい古いはずです。これは最初は1分未満です。
PIDがわかっている場合は、その長さがわかっているので、検索するファイルの数をさらに減らすことができます。
find -type f -mmin -1 -size 6c -exec grep 12345 {} \;
5桁のPIDの場合、サイズとして6cを使用します。これは、末尾に改行が含まれているためです(コメントとしてysangkokから)。