ファイルを削除しようとしていますが、シェルを介して正常に動作しますが、他のプログラムからスクリプトを呼び出すと、ファイルは削除されず、権限は奇妙なものに変わります。
$ touch example.txt
$ ls -la example.txt
-rw-r--r-- 1 user users 0 Mar 24 21:49 example.txt
$ rm example.txt
$ ls -la example.txt
-r-S--S--- 1 user users 0 Mar 24 21:49 example.txt
rm
このコマンドとこのコマンドを実行してみましたが、ファイルを別のファイルシステムにコピーするとmv
(mv
ファイルをコピーしてソースを削除するように動作します)、同じ結果が得られます。権限は常に同じではありません。以下は私が見たもののいくつかの例です。
-r-S--S--T
-r-S--S---
-r-S-----T
------S--T
rm
コマンドがファイルの削除を拒否し、権限のみを変更し、毎回権限をランダムに変更する原因は何ですか?
新しいシェルでコマンドを実行するとrm
正常に動作しますがexec()
。
どうやら、通常のシェルでは動作しますが、シェル内では失敗したら実行環境に問題があるようですが、exec()
どこから見てみるべきかさえわかりません。すべてが同じフォルダで同じユーザーとして実行されます。
誰もがこの動作を引き起こす方法、または正確に何が起こっているのかを調べ始める方法についてのヒントを提供できますか?
答え1
さて、ちょうど何が起こったのか気づいた。プログラムがexec()
バックグラウンドでジョブを実行していて、問題のあるmv
orが実行されたときに、以前のコマンドがまだ実行され、ファイルで動作していたことがわかりました。rm
だから何が起こるのか:
- 最初のプログラムはファイルを開き、読み取りを開始します。
- そのコマンド
mv
がrm
実行され、ファイルは正常に削除されます。 - 最初のプログラムはファイルを再作成し、変更を記録します。
プログラムは作業中のファイルを上書きするように設計されているため、書き込み用にファイルを開くときに権限が与えられず、既存の権限を再利用しようとします。ただし、プロセスはファイルを削除したため、ファイル権限を指定する未使用のパラメータと一緒にメモリ内の任意の数を使用して新しいファイルが生成されます。
最初のコマンドが完了するまで2番目のコマンドが実行されないようにプロセスを変更することで問題を解決しました。