5

有没有办法强制 Samba 进程关闭给定文件而不杀死它?

Samba 为每个客户端连接打开一个进程,有时我看到它保存打开文件的时间比需要的长得多。通常我只是杀死该进程,(Windows)客户端将在下次访问共享时重新打开它;但有时它会长时间主动读取其他文件,我只想“杀死”一个文件,而不是整个连接。

编辑:我试过'net rpc file close',但似乎不起作用。有人知道为什么吗?

编辑:是我发现的类似的最好的提及。这似乎是 win32 客户端的问题,微软服务器有一个解决方法;但桑巴没有。我希望该net rpc file close <fileid>命令有效,我将继续尝试找出原因。我接受了 LuckyLindy 的回答,即使它没有解决问题,因为这是在这种情况下唯一有用的程序。

4

8 回答 8

6

这种情况在我们的系统上经常发生,尤其是从 Win98 机器连接到 Samba 时。我们按照以下步骤来解决它(可能与您的相似):

  • 查看哪台计算机正在使用该文件(即lsof|grep -i <file_name>
  • 尝试从有问题的计算机打开该文件,或查看是否有进程隐藏在我们可以关闭的任务管理器中
  • 如果运气不好,让用户退出任何重要的网络程序
  • 从linux杀死用户的Samba进程(即kill -9 <pid>

我希望有更好的方法!

于 2009-02-26T03:34:28.620 回答
2

我正在创建一个新答案,因为我的第一个答案实际上只包含更多问题,而且真的没有太多帮助。

经过一番搜索,我没有找到任何当前 Samba 最新版本的开放错误,请查看Samba 错误报告网站,并创建一个新错误。这是让某人就如何修复它提出建议并让开发人员查看问题的最简单方法。LuckyLindy 在我之前的回答中留下了一条评论,说这已经是 5 年了,该项目是开源的,是通过报告或提供补丁来修复错误的最佳方式。

我还发现了一个邮件列表条目:Samba Open files,他们建议添加posix locking=no到配置文件中,只要您没有通过 NFS 分发的文件不锁定文件应该没问题,也就是说,如果文件是被锁住。

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

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

于 2009-02-26T07:50:06.430 回答
1

这可能在这里得到了回答:How to close a file descriptor from another process in unix systems

猜测一下,“net rpc file close”可能不起作用,因为告诉 Samba 关闭文件的进程间通信最终不会被查看,直到您要关闭的文件被读取完毕。

于 2009-02-19T20:21:59.333 回答
0

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

于 2008-09-26T21:18:31.280 回答
0

一般来说,您不能从外部干预进程文件描述符。然而,作为 root,您当然可以这样做,正如您在 1997 年的那篇 phrack 文章中看到的那样:http ://www.phrack.org/issues.html?issue=51&id=5#article - 我不建议在生产系统虽然...

于 2009-02-22T22:41:33.887 回答
0

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

于 2009-02-23T11:07:51.330 回答
0

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

列出所有打开的文件:

net rpc 文件 -U ADadmin %密码

ADadmin密码替换为 Windows AD 域管理员的凭据。这会为您提供文件 ID、打开文件的用户名、锁定状态和文件名。您经常希望通过 grep 管道来过滤结果。

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

net rpc 文件关闭fileid -U ADadmin %密码

于 2015-05-28T15:23:37.137 回答
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 才能关闭其他用户打开的文件,但它适用于您打开的文件。请注意,与文件的任何其他强制关闭一样,可能会发生数据损坏。只要文件处于非活动状态,就应该没问题。

它非常难看,但对于我的用例(关闭整个挂载点)来说,它工作得很好。

于 2016-03-05T09:29:22.420 回答