これは仮定のシナリオです。インターネット経由でファイル/フォルダを受信するプロセスによって同期されている特定のフォルダがあるとします。この操作が進行中は、同期のために、そのディレクトリへの cp 操作は行われません。とにかく、これを実現できますか?
答え1
少なくとも 2 つの解決策が考えられます。
- プロセスが実行中かどうかを確認するか、ロックファイルをテストして同期が実行中かどうかを確認し、操作を中止または遅延する cp のラッパー スクリプトを作成します。
LD_PRELOAD
接続やその他の通話に使用しますwrite
。
最初の解決策の問題は、、、、、、など、フォルダーへの書き込みに使用されるすべてのコマンドをラップする必要があることです。mv
その一方で、これは非常にシンプルですが、現在のユーザーに対してのみ機能します。cp
rsync
rm
ln
cat
2 番目の解決策では、ディレクトリの変更/修正に使用されるすべてのシステム コール ( write
、、unlink
など) を含む共有ライブラリを作成する必要rename
があります。ただし、この解決策は動的にリンクされたすべての実行可能ファイルで機能するため、他のすべてのプログラムを調整する必要はありません。
答え2
同期プロセスが実行中であり、実行可能な操作が のみであることがわかっている場合はcp
、SIGSTOP
すべてのプロセスに を送信して実行を一時停止できます。同期が完了したら、SIGCONT
すべてのプロセスに を送信して続行します。
この目的のために、kill -s SIGSTOP $(pidof cp)
または を使用できますkillall -s SIGSTOP cp
。ターミナルでは、Ctrl+を使用してタスクをバックグラウンド (「一時停止」) できます。実行を続行するには、コマンド (「フォアグラウンド」、 を参照)Zを使用します。fg
help fg
答え3
シンクロナイザーは、ディレクトリを読み取るのではなく、書き込みます。したがって、ファイルシステムのスナップショットを取得したり、不変ビットを設定したりすることはできません。
同期ツールを root として実行している場合は、ディレクトリの所有権を root に、権限を 700 (rwx------; 所有者のみが何でもできます) に変更できます。これにより、root として実行されていない新しいプロセスは実行されなくなりますが、既にファイルまたはサブディレクトリを開いているプロセスは引き続き変更を加えることができます。
Linux では、ツリー内で現在ファイルを開いているすべてのプロセスを検索するには、 を実行できますlsof +D my_directory
。ただし、その知識をどのように活用するかは状況によって異なります。