小编oli*_*ren的帖子

为什么(或如何)root 使用的打开文件描述符的数量超过 ulimit -n?

我们的服务器最近用完了文件描述符,对此我有一些疑问。ulimit -n应该给我最大数量的打开文件描述符。这个数字是 1024。我通过运行检查了打开的文件描述符的数量,lsof -u root |wc -l得到了 2500 个 fds。这比 1024 多得多,所以我猜这意味着数字 1024 是每个进程,而不是每个用户,就像我一样。好吧,我跑了lsof -p$PidOfGlassfish|wc -l,得到了 1300。这是我没有得到的部分。如果ulimit -n不是每个用户或每个进程的最大进程数,那么它有什么用?它不适用于root用户吗?如果是这样,我怎么能得到关于文件描述符用完的错误消息?

编辑:我能理解的唯一方法ulimit -n是它是否应用打开文件的数量(如 bash 手册中所述)而不是文件句柄的数量(不同的进程可以打开同一个文件)。如果是这种情况,那么仅列出打开文件的数量(grepping '/',从而排除内存映射文件)是不够的

lsof -u root |grep /|sort  -k9  |wc -l #prints '1738'
Run Code Online (Sandbox Code Playgroud)

要实际查看打开文件的数量,我需要对名称列进行过滤,仅打印唯一条目。因此,以下可能更正确:

lsof -u root |grep /|sort  -k9 -u |wc -l #prints '604'
Run Code Online (Sandbox Code Playgroud)

上面的命令需要 lsof 以以下格式输出:

java      32008 root  mem       REG                8,2 11942368      72721 /usr/lib64/locale/locale-archive
vmtoolsd   4764 root  mem       REG                8,2    18624     106432 /usr/lib64/open-vm-tools/plugins/vmsvc/libguestInfo.so
Run Code Online (Sandbox Code Playgroud)

这至少给了我小于 …

linux glassfish root max-file-descriptors

16
推荐指数
4
解决办法
5万
查看次数

防止关闭 SSH 本地端口转发

我在 Azure 上运行的 Ubuntu 虚拟机上运行各种服务,我想远程访问某些服务,即使端口没有公开开放。为此,我设置了一个脚本来使用 SSH进行本地端口转发

通常这是通过启动到远程主机的连接,执行sleep 10,并在 sleep 命令完成之前在转发的端口上建立连接来工作的。这在使用保持连接活动的服务时很有效,例如远程 SMB 共享。

但是我在访问 Web 服务时遇到问题,因为连接在一段时间后关闭 - 建立连接后 10-90 秒。

为了在它关闭时重新连接连接,我根据这个SO 线程编写了这个小脚本。

while true; do { \
    while true; do \
      echo echo ping; sleep 10; \
    done } | ssh -f myapp.cloudapp.net -F .ssh/myapp.cloudapp.net_config  \
             -o ExitOnForwardFailure=yes  sleep 10; echo "$(date) I died"; 
    sleep 1;
done
Run Code Online (Sandbox Code Playgroud)

不幸的是,这个“修复”有点不稳定,并且连接经常断开,因此浏览器每五个请求就会挂起。它有效,但远非完美,所以我想要一个更好的方法。也许可能有某种脚本进行长轮询之类的?有谁解决了这个问题?

port-forwarding ssh-tunnel

6
推荐指数
3
解决办法
2万
查看次数