有没有办法强制Samba进程关闭给定文件而不杀死它?
Samba为每个客户端连接打开一个进程,有时我发现它保存的打开文件比需要的时间长得多。通常我只是杀了进程,(windows)客户端将在下次访问共享时重新打开它;但有时它会长时间主动阅读其他文件,我想“杀死”一个文件,而不是整个连接。
编辑:我已经尝试了'net rpc file close',但似乎没有用。谁知道为什么?
编辑:this是我发现类似的东西。这似乎是win32客户端上的一个问题,微软服务器有一个解决方法;但桑巴没有。我希望net rpc file close <fileid>
命令有效,我会一直试图找出原因。我接受LuckyLindy的答案,即使它没有解决问题,因为在这种情况下它是唯一有用的程序。
答案 0 :(得分:5)
这种情况一直发生在我们的系统上,特别是从Win98机器连接到Samba时。我们按照以下步骤解决它(可能与您的相似):
lsof|grep -i <file_name>
)kill -9 <pid>
)我希望有更好的方法!
答案 1 :(得分:2)
我正在创建一个新的答案,因为我的第一个答案真的只包含了更多的问题,并且真的没有多少帮助。
经过一些搜索后,我找不到最新版本Samba的当前开放错误,请查看the Samba Bug Report网站,并创建一个新错误。这是让某人就如何修复它提出建议的最简单方法,让开发人员看看这个问题。 LuckyLindy在我之前的回答中留下了一条评论,说这就是现在已有5年了,这个项目是Open Source,是通过报告和提供补丁修复错误的最好方法。
我还找到了一个邮件列表条目:Samba Open files,他们建议在配置文件中添加posix locking=no
,只要你没有通过NFS分发的文件而不是锁定文件应该没问题,也就是说,如果文件被锁定,那就是。
如果你也想要,你可以编写一个使用ptrace并附加到程序的程序,它会通过并解锁并关闭所有文件。但是,请注意,这可能会使Samba处于未知状态,这可能更危险。
我已经提到过的工作是定期重启samba作为解决方法。我知道这不是一个解决方案,但它可能会暂时起作用。
答案 2 :(得分:1)
这可能在这里回答:How to close a file descriptor from another process in unix systems
猜测,'net rpc file close'可能不起作用,因为在你想要关闭的文件被读取之前,告诉Samba关闭文件的进程间通信没有被查看。
答案 3 :(得分:0)
如果samba中没有显式选项,则无法使用标准unix接口从外部关闭打开的文件描述符。
答案 4 :(得分:0)
一般来说,您无法干涉外部的流程文件描述符。然而,正如你在1997年的那篇phrack文章中看到的那样,当然你可以这样做:http://www.phrack.org/issues.html?issue=51&id=5#article - 我不建议在生产系统上这样做但是......
答案 5 :(得分:0)
在这种情况下更好的问题是为什么?为什么要提前关闭文件?最终关闭文件的目的是什么?你想要完成什么?
答案 6 :(得分:0)
Samba提供了查看打开文件并关闭它们的命令。
列出所有打开的文件:
net rpc file -U ADadmin %密码
使用Windows AD域管理员的凭据替换 ADadmin 和密码。这会为您提供文件ID,用户名,打开状态,锁定状态和文件名。您经常希望通过grep管道来过滤结果。
找到要关闭的文件后,请复制其文件ID号并使用此命令:
net rpc file close fileid -U ADadmin %密码
答案 7 :(得分:0)
我需要完成这样的事情,以便我可以轻松卸载我碰巧分享的设备。我写了这个快速的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来关闭其他用户打开的文件,但它对你打开的文件很有效。请注意,与任何其他强制关闭文件一样,可能会发生数据损坏。只要文件处于非活动状态,它应该没问题。
这很丑陋,但对于我的用例(关闭整个挂载点),它运作良好。