File Events

FileWatching.poll_fdFunction
poll_fd(fd, timeout_s::Real=-1; readable=false, writable=false)

ファイルディスクリプタ fd の読み取りまたは書き込みの可用性の変化を監視し、timeout_s 秒で指定されたタイムアウトを設定します。

キーワード引数は、どの読み取りおよび/または書き込みの状態を監視するかを決定します。少なくとも1つは true に設定する必要があります。

返される値は、ポーリングの結果を示すブール型フィールド readablewritable、および timedout を持つオブジェクトです。

これは FDWatcher に対して wait を呼び出すための薄いラッパーであり、機能を実装していますが、ユーザーが終了時に手動で close を呼び出す必要があり、そうしないと深刻なクラッシュのリスクがあります。

source
FileWatching.poll_fileFunction
poll_file(path::AbstractString, interval_s::Real=5.007, timeout_s::Real=-1) -> (previous::StatStruct, current)

ファイルの変更を監視するために、interval_s 秒ごとにポーリングを行い、変更が発生するか timeout_s 秒が経過するまで待機します。interval_s は長い期間であるべきで、デフォルトは 5.007 秒です。

変更が検出されると、ステータスオブジェクトのペア (previous, current) を返します。previous ステータスは常に StatStruct ですが、すべてのフィールドがゼロに設定されている場合があります(これは、ファイルが以前は存在しなかったか、以前はアクセスできなかったことを示します)。

current ステータスオブジェクトは StatStructEOFError(タイムアウトが経過したことを示す)、または他の Exception サブタイプ(stat 操作が失敗した場合、たとえば、パスが存在しない場合)である可能性があります。

ファイルがいつ変更されたかを判断するには、!(current isa StatStruct && prev == current) を比較して、mtime または inode の変更通知を検出します。ただし、この操作には watch_file を使用することが推奨されます。これはより信頼性が高く効率的ですが、状況によっては利用できない場合があります。

これは PollingFileWatcherwait を呼び出すための薄いラッパーであり、機能を実装していますが、この関数には poll_file の連続呼び出し間に小さなレースウィンドウがあり、その間にファイルが変更されても検出されない可能性があります。

source
FileWatching.watch_fileFunction
watch_file(path::AbstractString, timeout_s::Real=-1)

ファイルまたはディレクトリ path の変更を監視し、変更が発生するまで、または timeout_s 秒が経過するまで待機します。この関数はファイルシステムをポーリングせず、代わりにプラットフォーム固有の機能を使用してオペレーティングシステムからの通知を受け取ります(例:Linuxのinotifyを介して)。詳細については、以下のNodeJSドキュメントを参照してください。

返される値は、ファイルの監視結果を示すブール型フィールド renamedchanged、および timedout を持つオブジェクトです。

この関数の動作はプラットフォームによってわずかに異なります。詳細な情報については、https://nodejs.org/api/fs.html#fs_caveats を参照してください。

これは FileMonitorwait を呼び出すための薄いラッパーです。この関数には、連続した watch_file の呼び出しの間にファイルが検出されずに変更される可能性がある小さなレースウィンドウがあります。このレースを避けるために、次のように使用してください。

fm = FileMonitor(path)
wait(fm)

毎回 wait する際に同じ fm を再利用します。

source
FileWatching.watch_folderFunction
watch_folder(path::AbstractString, timeout_s::Real=-1)

ファイルまたはディレクトリ path の変更を監視し、変更が発生するか timeout_s 秒が経過するまで待機します。この関数はファイルシステムをポーリングせず、代わりにプラットフォーム固有の機能を使用してオペレーティングシステムからの通知を受け取ります(例:Linuxのinotifyを介して)。詳細については、以下のNodeJSドキュメントを参照してください。

この関数は、unwatch_folder が同じ path に対して呼び出されるまで、バックグラウンドで path の変更を追跡し続けます。

返される値は、最初のフィールドが変更されたファイルの名前(利用可能な場合)で、2番目のフィールドがイベントを示すブールフィールド renamedchanged、および timedout を持つオブジェクトのペアです。

この関数の動作はプラットフォームによってわずかに異なります。詳細な情報については https://nodejs.org/api/fs.html#fs_caveats を参照してください。

この関数は、タイムアウトサポートを追加した FolderMonitorwait を呼び出すための薄いラッパーです。

source
FileWatching.unwatch_folderFunction
unwatch_folder(path::AbstractString)

pathの変更に対するバックグラウンドトラッキングを停止します。同じパスでwatch_folderが戻るのを待っている別のタスクがある間にこれを行うことは推奨されません。結果が予測不可能になる可能性があります。

source
FileWatching.FileMonitorType
FileMonitor(path::AbstractString)

ファイルまたはディレクトリ path(存在する必要があります)を変更のために監視します。変更が発生するまでこの関数はファイルシステムをポーリングせず、代わりにプラットフォーム固有の機能を使用してオペレーティングシステムからの通知を受け取ります(例:Linuxのinotifyを介して)。詳細については、以下のNodeJSドキュメントを参照してください。

fm = FileMonitor(path) は自動リセットイベントのように動作するため、wait(fm) は指定されたパスに元々あったファイルで少なくとも1つのイベントが発生するまでブロックし、その後、最後の wait 呼び出しから発生したすべての変更を要約するブールフィールド renamedchangedtimedout を持つオブジェクトを返します。

この関数の動作はプラットフォームによってわずかに異なります。詳細な情報については https://nodejs.org/api/fs.html#fs_caveats を参照してください。

source
FileWatching.FolderMonitorType
FolderMonitor(folder::AbstractString)

ファイルまたはディレクトリ path の変更を監視します。変更が発生するまで待機します。この関数はファイルシステムをポーリングせず、代わりにプラットフォーム固有の機能を使用してオペレーティングシステムからの通知を受け取ります(例:Linuxのinotifyを介して)。詳細については、以下のNodeJSドキュメントを参照してください。

これはChannelに似た動作をするため、take!(またはwait)を呼び出すと、何らかの変更が発生するまでブロックされます。wait関数は、最初のフィールドが変更されたファイルの名前(利用可能な場合)で、2番目のフィールドがrenamedおよびchangedというブールフィールドを持つオブジェクトを返し、その上で発生したイベントを示します。

この関数の動作はプラットフォームによってわずかに異なります。詳細な情報についてはhttps://nodejs.org/api/fs.html#fs_caveatsを参照してください。

source
FileWatching.PollingFileWatcherType
PollingFileWatcher(path::AbstractString, interval_s::Real=5.007)

ファイルの変更を監視するために、interval_s 秒ごとに stat をポーリングします。変更が発生するか、timeout_s 秒が経過するまで続けます。interval_s は長い期間であるべきで、デフォルトは 5.007 秒です。最新の結果を得るために stat を呼び出しますが、古い結果になります。

これは自動リセットイベントのように機能するため、wait を呼び出すと、wait 呼び出し時にキャプチャされた前の値から stat 結果が変更されるまでブロックします。wait 関数は、前回 wait が呼び出されてからの stat 変更が検出されると、ステータスオブジェクトのペア (previous, current) を返します。previous ステータスは常に StatStruct ですが、すべてのフィールドがゼロに設定されている場合があります(ファイルが以前は存在しなかったか、以前はアクセスできなかったことを示します)。

current ステータスオブジェクトは StatStructEOFError(このオブジェクトを閉じることで待機がキャンセルされた場合)、または他の Exception サブタイプ(stat 操作が失敗した場合、たとえば、パスが削除された場合)である可能性があります。ファイルが再度複数回変更された場合、stat 値が古くなる可能性があることに注意してください。

この操作には FileMonitor を使用することが推奨されます。なぜなら、より信頼性が高く効率的だからです。ただし、状況によっては利用できない場合があります。

source
FileWatching.FDWatcherType
FDWatcher(fd::Union{RawFD,WindowsRawSocket}, readable::Bool, writable::Bool)

ファイルディスクリプタ fd の読み取りまたは書き込みの可用性の変化を監視します。

キーワード引数は、どの読み取りおよび/または書き込みの状態を監視するかを決定します。少なくとも1つは true に設定する必要があります。

返される値は、ポーリングの結果を示すブールフィールド readablewritable、および timedout を持つオブジェクトです。

これはレベルセットイベントのように動作するため、wait を呼び出すと、これらの条件のいずれかが満たされるまでブロックしますが、その後は条件がクリアされるまでブロックせずに返され続けます(読み取るものがなくなるか、書き込みバッファに空きがなくなるか、またはその両方です)。

Warning

このオブジェクトの使用が終了したら、fd 引数が閉じられる前に close を手動で呼び出す必要があります。これを怠ると、深刻なクラッシュのリスクがあります。

source

Pidfile

アドバイザリーpidファイル(ロックファイル)を作成するためのシンプルなユーティリティツールです。

Primary Functions

FileWatching.Pidfile.mkpidlockFunction
mkpidlock([f::Function], at::String, [pid::Cint]; kwopts...)
mkpidlock(at::String, proc::Process; kwopts...)

現在のプロセスまたはpidまたはprocによって識別されるプロセスのために、パス「at」のためのpidファイルロックを作成します。ロックされた後に実行する関数を受け取ることができ、doブロックで使用され、その後ロックは自動的に閉じられます。ロックに失敗し、waitがfalseの場合、エラーがスローされます。

ロックは、closefinalizer、またはprocが終了した後すぐに解放されます。戻り値がプログラムのクリティカルセクションの終わりまで生きていることを確認してください。そうしないと、finalizerが早期にそれを回収してしまいます。

オプションのキーワード引数:

  • mode: ファイルアクセスモード(プロセスのumaskによって修正されます)。デフォルトは世界中から読み取り可能です。
  • poll_interval: 試行の間の最大時間を指定します(watch_fileが機能しない場合)。
  • stale_age: 既存のpidファイルを削除します(ロックを無視して)、この秒数より古い場合、そのmtimeに基づいています。ファイルは、ファイル内のpidが有効である可能性がある場合、これより5倍長くなるまで削除されません。また、refreshが0にオーバーライドされてロックの更新が無効にされている場合は、25倍長くなります。デフォルトではこれは無効になっています(stale_age = 0)が、一般的に推奨される値は、推定される通常の完了時間の約3-5倍です。
  • refresh: 経過した時間の間隔ごとにmtimeを更新することによって、ロックが古くなるのを防ぎます。デフォルトでは、これはstale_age/2に設定されており、推奨される値です。
  • wait: trueの場合、ロックを取得するまでブロックし、falseの場合、ロックに失敗した場合はエラーを発生させます。
source
FileWatching.Pidfile.trymkpidlockFunction
trymkpidlock([f::Function], at::String, [pid::Cint]; kwopts...)
trymkpidlock(at::String, proc::Process; kwopts...)

mkpidlockと同様ですが、ファイルがすでにロックされている場合は待機するのではなくfalseを返します。

Julia 1.10

この関数は少なくともJulia 1.10が必要です。

source
Base.closeMethod
close(lock::LockMonitor)

pidfileロックを解除します。

source

Helper Functions

FileWatching.Pidfile.open_exclusiveFunction
open_exclusive(path::String; mode, poll_interval, wait, stale_age, refresh) :: File

読み書きの助言的排他アクセスのために新しいファイルを作成します。waitfalseの場合、ロックファイルが存在する場合はエラーを出力し、そうでない場合はロックを取得するまでブロックします。

キーワード引数の説明については、mkpidlockを参照してください。

source
FileWatching.Pidfile.tryopen_exclusiveFunction
tryopen_exclusive(path::String, mode::Integer = 0o444) :: Union{Void, File}

読み書きの助言的排他アクセスのために新しいファイルを作成しようとし、既に存在する場合は何も返さない。

source
FileWatching.Pidfile.parse_pidfileFunction
parse_pidfile(file::Union{IO, String}) => (pid, hostname, age)

私たちのpidfileフォーマットを解析しようとし、失敗した読み取りに対してそれぞれ(0, "", 0.0)に要素を置き換えました。

source
FileWatching.Pidfile.stale_pidfileFunction
stale_pidfile(path::String, stale_age::Real, refresh::Real) :: Bool

open_exclusive のためのヘルパー関数で、pidfile が古いかどうかを判断します。

source
FileWatching.Pidfile.isvalidpidFunction
isvalidpid(hostname::String, pid::Cuint) :: Bool

pidが有効なプロセスIDであるかどうかを保守的に推定しようとします。

source
Base.Filesystem.touchMethod
Base.touch(::Pidfile.LockMonitor)

ロックの mtime を更新して、それがまだ新しいことを示します。

mkpidlock コンストラクタの refresh キーワードも参照してください。

source