有没有办法强迫Samba进程接近一个指定的文件,而不杀死它?

Samba打开了一个进程的每个客户连接,以及有时候我看到它拥有打开文件,远远超过需要的。通常我只是杀死的过程中,和(windows)客户,将重新打开它的下一次访问的份额;但有时这是积极的阅读其他的文件很长一段时间,我想到只是杀了一个文件,而不是整体连接。

编辑:我已经试过了净rpc文件接近'的,但似乎没有工作。有人知道为什么吗?

编辑: 是最好的说,我发现的类似的东西。这似乎是一个问题上win32客户,这微软服务器都有一个解决办法;但Samba不。我希望的 net rpc file close <fileid> 命令的工作,我会不断试图找出原因。我接受LuckyLindy的答案,即使它没有解决的问题,因为它是唯一有用的程序,在这种情况。

有帮助吗?

解决方案

这一切发生的时间在我们的系统,尤其是在连接到Samba从windows98下机。我们遵循这些步骤,以解决(这是可能类似于你):

  • 看看哪些计算机使用的文件(即 lsof|grep -i <file_name>)
  • 试着打开那个文件的计算机犯罪,或看,如果一个过程是躲藏在任务经理,我们就可以关闭
  • 如果没有发运,有的用户出口任何重要的网络节目
  • 杀了用户的Samba过程中从linux(即 kill -9 <pid>)

我希望有一个更好的办法!

其他提示

我正在创建一个新的答案,因为我的第一个答案真的只包含了更多的问题,并且真的没有多少帮助。

经过一些搜索后,我找不到最新版Samba的当前开放漏洞,请查看 Samba Bug Report 网站,并创建一个新的bug。这是让某人就如何修复它提出建议的最简单方法,让开发人员看看这个问题。 LuckyLindy在我之前的回答中留下了一条评论,说这就是现在已有5年了,这个项目是Open Source,是通过报告和提供补丁修复错误的最好方法。

我还找到了一个邮件列表条目: Samba打开文件,他们建议在配置文件中添加posix locking=no,只要你没有通过NFS发出的文件而不是锁定文件就应该没问题,也就是说,如果正在保存的文件是锁定的。 / p>

如果你也想要,你可以编写一个使用ptrace并附加到程序的程序,它会通过并解锁并关闭所有文件。但是,请注意,这可能会使Samba处于未知状态,这可能更危险。

我已经提到过的工作是定期重启samba作为解决方法。我知道这不是一个解决方案,但它可能会暂时起作用。

这可能在这里得到解答:如何从unix系统中的另一个进程关闭文件描述符

猜测,'net rpc file close'可能不起作用,因为在你想要关闭的文件被读取之前,告诉Samba关闭文件的进程间通信没有被查看。

如果samba中没有显式选项,则无法使用标准unix接口从外部关闭打开的文件描述符。

一般来说,您无法干涉外部的流程文件描述符。然而,正如你在1997年的那篇phrack文章中看到的那样,当然你可以这样做:

在这种情况下更好的问题是为什么?为什么要提前关闭文件?最终关闭文件的目的是什么?你想要完成什么?

Samba提供了查看打开文件并关闭它们的命令。

列出所有打开的文件:

net rpc file -U ADadmin 密码

使用Windows AD域管理员的凭据替换 ADadmin 密码。这将为您提供文件ID,打开的用户名,锁定状态和文件名。您经常需要通过grep。

来管理结果

找到要关闭的文件后,请复制其文件ID号并使用以下命令:

net rpc file close fileid -U ADadmin 密码

我需要完成这样的事情,以便我可以轻松卸载我碰巧分享的设备。我写了这个快速的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

它需要一个参数,即关闭的路径:

smbclose /media/drive

任何匹配该参数的路径(通过grep)都会关闭,因此您应该非常具体。 (只有通过samba打开的文件才会受到影响。)显然,你需要root来关闭其他用户打开的文件,但它对你打开的文件很有效。请注意,与任何其他强制关闭文件一样,可能会发生数据损坏。只要文件处于非活动状态,它应该没问题。

这很丑陋,但对于我的用例(关闭整个挂载点),它运作良好。

scroll top