とにかく cp プロセスを失敗/遅延させるには?

とにかく cp プロセスを失敗/遅延させるには?

これは仮定のシナリオです。インターネット経由でファイル/フォルダを受信するプロセスによって同期されている特定のフォルダがあるとします。この操作が進行中は、同期のために、そのディレクトリへの cp 操作は行われません。とにかく、これを実現できますか?

答え1

少なくとも 2 つの解決策が考えられます。

  1. プロセスが実行中かどうかを確認するか、ロックファイルをテストして同期が実行中かどうかを確認し、操作を中止または遅延する cp のラッパー スクリプトを作成します。
  2. LD_PRELOAD接続やその他の通話に使用しますwrite

最初の解決策の問題は、、、、、、など、フォルダーへの書き込みに使用されるすべてのコマンドをラップする必要があることです。mvその一方で、これは非常にシンプルですが、現在のユーザーに対してのみ機能します。cprsyncrmlncat

2 番目の解決策では、ディレクトリの変更/修正に使用されるすべてのシステム コール ( write、、unlinkなど) を含む共有ライブラリを作成する必要renameがあります。ただし、この解決策は動的にリンクされたすべての実行可能ファイルで機能するため、他のすべてのプログラムを調整する必要はありません。

答え2

同期プロセスが実行中であり、実行可能な操作が のみであることがわかっている場合はcpSIGSTOPすべてのプロセスに を送信して実行を一時停止できます。同期が完了したら、SIGCONTすべてのプロセスに を送信して続行します。

この目的のために、kill -s SIGSTOP $(pidof cp)または を使用できますkillall -s SIGSTOP cp。ターミナルでは、Ctrl+を使用してタスクをバックグラウンド (「一時停止」) できます。実行を続行するには、コマンド (「フォアグラウンド」、 を参照)Zを使用します。fghelp fg

答え3

シンクロナイザーは、ディレクトリを読み取るのではなく、書き込みます。したがって、ファイルシステムのスナップショットを取得したり、不変ビットを設定したりすることはできません。

同期ツールを root として実行している場合は、ディレクトリの所有権を root に、権限を 700 (rwx------; 所有者のみが何でもできます) に変更できます。これにより、root として実行されていない新しいプロセスは実行されなくなりますが、既にファイルまたはサブディレクトリを開いているプロセスは引き続き変更を加えることができます。

Linux では、ツリー内で現在ファイルを開いているすべてのプロセスを検索するには、 を実行できますlsof +D my_directory。ただし、その知識をどのように活用するかは状況によって異なります。

関連情報