代码之家  ›  专栏  ›  技术社区  ›  Javier

强制Samba进程关闭文件

  •  4
  • Javier  · 技术社区  · 16 年前

    有没有一种方法可以强制Samba进程关闭给定的文件而不杀死它?

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

    编辑: this 这是我发现的最好的一个类似的例子。这似乎是win32客户端的一个问题,microsoft服务器有一个解决方案;但桑巴没有。我希望 net rpc file close <fileid> 命令起作用了,我会继续找出原因。我接受了LuckyLindy的答案,即使它没有解决问题,因为这是这种情况下唯一有用的程序。

    8 回复  |  直到 16 年前
        1
  •  6
  •   Beep beep    16 年前

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

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

    我希望有更好的办法!

        2
  •  2
  •   X-Istence    16 年前

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

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

    我还发现了一个邮件列表条目: Samba Open files ,他们建议加上 posix locking=no

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

        3
  •  1
  •   Community CDub    8 年前

    这里的答案可能是: How to close a file descriptor from another process in unix systems

    据猜测,“netrpcfileclose”可能不起作用,因为告诉Samba关闭文件的进程间通信在您要关闭的文件被读取之前不会被查看。

        4
  •  0
  •   hayalci    16 年前

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

        5
  •  0
  •   Sec    16 年前

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

        6
  •  0
  •   X-Istence    16 年前

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

        7
  •  0
  •   oo12    10 年前

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

    net rpc文件-U 阿达明 % 暗语

    阿达明 具有Windows AD域管理员的凭据。这将为您提供一个文件id、打开它的用户的用户名、锁定状态和文件名。您经常希望通过grep管道过滤结果。

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

    net rpc文件关闭 文件ID 阿达明 %

        8
  •  0
  •   jpfx1342    9 年前

    我需要完成类似的工作,以便能够轻松卸载碰巧共享的设备。我写了这个快速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用户来关闭其他用户打开的文件,但对于您打开的文件,它可以正常工作。请注意,与任何其他强制关闭文件一样,可能会发生数据损坏。只要文件处于非活动状态,就应该可以了。

    这很难看,但对于我的用例(关闭整个装载点)来说,它已经足够好了。