質問

特定のファイルを強制終了せずにSambaプロセスに強制的に閉じる方法はありますか?

Sambaはクライアント接続ごとにプロセスを開きます。開いているファイルが必要以上に長く保持されていることがあります。通常、私はプロセスを強制終了するだけで、(windows)クライアントは次に共有にアクセスしたときに再び開きます。しかし、時には他のファイルを長時間アクティブに読み込んでいるので、接続全体ではなく1つのファイルを「強制終了」したいだけです。

編集: 'net rpc file close'を試しましたが、動作しないようです。誰もがその理由を知っていますか?

edit:これは最高の言及です同様の何かを見つけました。これはwin32クライアントの問題のようです。Microsoftサーバーには回避策があります。しかし、Sambaはそうではありません。 net rpc file close <fileid>コマンドが機能することを望みます。理由を探り続けます。 LuckyLindyの答えは、それが問題を解決しなかったとしても受け入れます。この場合、唯一の便利な手順だからです。

役に立ちましたか?

解決

これは、特にWin98マシンからSambaに接続している場合、システムで常に発生します。以下の手順に従って解決します(おそらくあなたのものと似ています):

  • ファイルを使用しているコンピューターを確認します(つまり、lsof|grep -i <file_name>
  • 問題のコンピューターからそのファイルを開くか、閉じることができるタスクマネージャーにプロセスが隠れているかどうかを確認してください
  • 運が悪ければ、ユーザーに重要なネットワークプログラムを終了させます
  • LinuxからユーザーのSambaプロセスを強制終了します(つまり、kill -9 <pid>

もっと良い方法があればいいのに!

他のヒント

新しい回答を作成しています。最初の回答には本当に質問が多く含まれていて、実際にはあまり役に立ちませんでした。

少し検索を行った後、Sambaの最新バージョンの現在の未解決のバグを見つけることができませんでした。 Samba Bug Report Webサイトにアクセスして、新しいバグを作成します。これは、おそらくそれを修正する方法についてのアイデアを誰かに提案させ、開発者に問題を見てもらう最も簡単な方法です。 LuckyLindyは、これが5年前のやり方であるというコメントを以前の回答に残しました。プロジェクトは、オープンソースであり、それを報告したり、パッチを提供したりすることで問題を修正する最良の方法です。

1つのメーリングリストエントリも見つかりました。 Samba Open files は、NFSを介してファイルを渡さない限り、構成ファイルにposix locking=noを追加することをお勧めします。ファイルをロックしないことは問題ありません。つまり、ファイルが保持されている場合はロックされます。 / p>

必要に応じて、ptraceを使用してプログラムにアタッチするプログラムを作成できます。このプログラムはすべてのファイルを通過してロックを解除し、閉じます。ただし、これによりSambaが不明な状態になる可能性があり、より危険な可能性があることに注意してください。

既に述べた回避策は、回避策としてsambaを定期的に再起動することです。解決策ではないことは承知していますが、一時的に機能する可能性があります。

これはおそらくここで回答されています: UNIXシステムで別のプロセスからファイル記述子を閉じる方法

推測では、「net rpc file close」はおそらく動作しません。ファイルを閉じるようにSambaに指示するプロセス間通信は、閉じたいファイルが読み込まれるまで見られないからです。

sambaに明示的なオプションがない場合、標準のUNIXインターフェイスで開いているファイル記述子を外部的に閉じることは不可能です。

一般的に、外部からプロセスファイル記述子を操作することはできません。しかし、1997年のフレーズの記事で見たように、ルートとしてはもちろんそれを行うことができます: http://www.phrack.org/issues.html?issue=51 <!> amp; id = 5#article -実稼働システムで行うことはお勧めしませんしかし...

この場合のより良い質問は、なぜでしょうか?なぜファイルを早く閉じたいのですか?最終的にファイルを閉じる必要があるのはどのような目的ですか?何を達成しようとしていますか?

Sambaは、開いているファイルを表示して閉じるためのコマンドを提供します。

開いているすべてのファイルを一覧表示するには:

net rpc file -U ADadmin password

ADadmin password をWindows ADドメイン管理者の資格情報に置き換えます。これにより、ファイルID、開いたユーザーのユーザー名、ロック状態、およびファイル名が得られます。多くの場合、grepを介してパイプすることで結果をフィルター処理します。

閉じるファイルが見つかったら、そのファイルID番号をコピーして次のコマンドを使用します。

net rpc file close fileid -U ADadmin password

共有しているデバイスを簡単にアンマウントできるように、このようなことを行う必要がありました。この簡単なbashスクリプトを書きました:

#!/bin/bash
PIDS_TO_CLOSE=$(smbstatus -L | tail -n-3 | grep "$1" | cut -d' ' -f1 - | sort -u | sed '/^$/$
for PID in $PIDS_TO_CLOSE; do
    kill $PID
done

1つの引数、閉じるパスを取ります:

smbclose /media/drive

その引数に一致する(grepによる)パスはすべて閉じられるため、かなり具体的に指定する必要があります。 (sambaで開いたファイルのみが影響を受けます。)明らかに、他のユーザーが開いたファイルを閉じるにはrootが必要ですが、開いているファイルでは正常に機能します。他のファイルを強制的に閉じる場合と同様に、データの破損が発生する可能性があることに注意してください。ファイルが非アクティブである限り、問題ありません。

かなりugいですが、ユースケース(マウントポイント全体を閉じる)では十分に機能します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top