强制Samba进程关闭文件
有没有办法强制Samba进程关闭给定文件而不杀死它?
Samba为每个客户端连接打开一个进程,有时我看到它保存打开文件的时间远远超过了需要的时间。通常,我只是终止该进程,并且(windows)客户端在下次访问共享时将重新打开该进程;但有时它会很长一段时间都在积极地读取其他文件,而我只是想"杀死"一个文件,而不是整个连接。
编辑:我已经尝试过'net rpc file close',但是似乎没有用。有人知道为什么吗?
编辑:这是我发现类似的东西的最好的提法。在Win32客户端上,这似乎是个问题,这是Microsoft服务器可以解决的问题。但是Samba没有。我希望net rpc file close <fileid>
命令起作用,我将继续尝试找出原因。即使它不能解决问题,我也接受LuckyLindy的回答,因为在这种情况下,这是唯一有用的过程。
解决方案
如果samba中没有显式选项,则无法使用标准的unix接口从外部关闭打开的文件描述符。
这可能在这里得到回答:如何从UNIX系统中的另一个进程关闭文件描述符
猜测" net rpc文件关闭"可能不起作用,因为告诉Samba关闭文件的进程间通信最终在未读完要关闭的文件后才被查看。
一般来说,我们不能从外部插入进程文件描述符。但是作为根,我们当然可以这样做,就像我们在1997年的phrack文章中所看到的那样:http://www.phrack.org/issues.html?issue=51&id=5#article我不建议在生产环境中这样做系统...
在这种情况下,更好的问题是为什么?我们为什么要提早关闭文件?最终关闭文件有什么目的?我们想完成什么?
这在我们的系统上一直存在,特别是从Win98机器连接到Samba时。我们按照以下步骤解决它(可能与类似):
- 查看哪台计算机正在使用该文件(即
lsof | grep -i <文件名>
) - 尝试从有问题的计算机上打开该文件,或者查看是否有一个进程正在任务管理器中隐藏,我们可以关闭该进程
- 如果没有运气,请让用户退出任何重要的网络程序
- 从linux杀死用户的Samba进程(即
kill -9 <pid>
)
我希望有更好的方法!
我正在创建一个新的答案,因为我的第一个答案确实只包含更多问题,而实际上并没有太多帮助。
经过一番搜索后,我无法找到最新版本的Samba的任何当前打开的错误,请访问Samba错误报告网站,并创建一个新的错误。这是最简单的方法,可以使某人对如何解决它提出建议,并让开发人员研究该问题。 LuckyLindy在我的上一个答复中留下了评论,说这是五年来的方式,而该项目是"开源",是通过报告或者提供补丁来修复错误的最佳方法。
我还发现了一个邮件列表条目:Samba Open文件,他们建议在配置文件中添加posix lock = no
,只要我们也没有将文件交出NFS而不锁定文件就可以了,也就是说,如果正在保存文件,则被锁定。
如果也需要,我们可以编写一个使用ptrace并将其添加到该程序的程序,该程序将通过并解锁并关闭所有文件。但是,请注意,这可能会使Samba处于未知状态,这可能会更加危险。
我已经提到的解决方法是定期重新启动samba。我知道这不是解决方案,但可能会暂时起作用。