现在,我知道如何:
ulimit -nlsof | wc -lcat /proc/sys/fs/file-max我的问题是:为什么在 Linux 中有打开文件的限制?
如何找到已被删除但仍在应用程序中打开的大文件?即使进程打开了这样的文件,如何删除它?
情况是我们正在运行一个正在以极快的速度填充日志文件的进程。我知道原因,我可以解决它。在那之前,我想在不关闭进程的情况下 rm 或清空日志文件。
简单地执行rm output.log仅删除对文件的引用,但它会继续占用磁盘空间,直到进程终止。更糟糕的是:在rming之后我现在无法找到文件在哪里或有多大!有没有办法找到该文件,并可能清空它,即使它仍然在另一个进程中打开?
我特指基于 Linux 的操作系统,例如 Debian 或 RHEL。
有时候,我想卸载USB设备使用umount /run/media/theDrive,但我得到一个drive is busy错误。
如何找出哪些进程或程序正在访问设备?
ulimit 中的硬限制和软限制有什么区别?
对于打开文件的数量,我的软限制为 1024,硬限制为 10240。可以运行打开超过 1024 个文件的程序。什么是软限制?
我想确定哪个进程具有 UNIX 套接字的另一端。
具体来说,我问的是用 来创建的socketpair(),尽管任何 UNIX 套接字的问题都是一样的。
我有一个程序parent可以创建一个socketpair(AF_UNIX, SOCK_STREAM, 0, fds), 和fork()s。父进程关闭fds[1]并保持fds[0]通信。孩子反其道而行之,close(fds[0]); s=fds[1]。然后孩子exec()的另一个程序,child1。两者可以通过这个 socketpair 来回通信。
现在,假设我知道parent是谁,但我想弄清楚是谁child1。我该怎么做呢?
有几种工具可供我使用,但没有一个可以告诉我套接字的另一端是哪个进程。我试过了:
lsof -c prognamelsof -c parent -c child1ls -l /proc/$(pidof server)/fdcat /proc/net/unix基本上,我可以看到两个套接字以及关于它们的所有内容,但无法判断它们是否已连接。我试图确定父进程中的哪个 FD 正在与哪个子进程通信。
我知道我可以查看使用过程中打开文件lsof 的时间在那一刻,我的Linux机器上。但是,进程可以如此快速地打开、更改和关闭文件,以至于我在使用标准 shell 脚本(例如watch)监视它时将无法看到它,如“在 linux 上监视打开的进程文件(实时)”中所述.
所以,我想我正在寻找一种简单的方法来审核流程并查看它在过去的时间里做了什么。如果还可以查看它(尝试)建立的网络连接并在进程有时间运行而不启动审计之前开始审计,那就太好了。
理想情况下,我想这样做:
sh $ audit-lsof /path/to/executable
4530.848254 OPEN read /etc/myconfig
4530.848260 OPEN write /var/log/mylog.log
4540.345986 OPEN read /home/gert/.ssh/id_rsa <-- suspicious
4540.650345 OPEN socket TCP ::1:34895 -> 1.2.3.4:80 |
[...]
4541.023485 CLOSE /home/gert/.ssh/id_rsa <-- would have missed
4541.023485 CLOSE socket TCP ::1:34895 -> 1.2.3.4:80 | this when polling
Run Code Online (Sandbox Code Playgroud)
这是否可以使用strace某些标志来看不到每个系统调用?
我正在交互式 bash 会话中运行。我已经使用 exec 创建了一些文件描述符,我想列出我的 bash 会话的当前状态。
有没有办法列出当前打开的文件描述符?
我试图在这个特定示例的上下文中理解命名管道。
我输入<(ls -l)我的终端并得到输出,bash: /dev/fd/63: Permission denied.
如果我输入cat <(ls -l),我可以看到目录内容。如果我更换cat用echo,我觉得我得到的终端名称(或者是什么呢?)。
echo <(ls -l)给出输出为/dev/fd/63。
此外,这个示例输出我不清楚。
ls -l <(echo "Whatever")
lr-x------ 1 root root 64 Sep 17 13:18 /dev/fd/63 -> pipe:[48078752]
Run Code Online (Sandbox Code Playgroud)
但是,如果我给出,ls -l <()它会列出目录内容。
在命名管道的情况下会发生什么?
我需要一个命令来等待进程开始接受特定端口上的请求。
linux中有没有这样做的东西?
while (checkAlive -host localhost -port 13000 == false)
do some waiting
...
Run Code Online (Sandbox Code Playgroud) 在 Linux 中/proc/PID/fd/X,作为管道或套接字的文件描述符的链接有一个编号,例如:
l-wx------ 1 user user 64 Mar 24 00:05 1 -> pipe:[6839]
l-wx------ 1 user user 64 Mar 24 00:05 2 -> pipe:[6839]
lrwx------ 1 user user 64 Mar 24 00:05 3 -> socket:[3142925]
lrwx------ 1 user user 64 Mar 24 00:05 4 -> socket:[3142926]
lr-x------ 1 user user 64 Mar 24 00:05 5 -> pipe:[3142927]
l-wx------ 1 user user 64 Mar 24 00:05 6 -> pipe:[3142927]
lrwx------ 1 user user 64 Mar 24 00:05 7 …Run Code Online (Sandbox Code Playgroud) open-files ×10
process ×6
linux ×2
lsof ×2
pipe ×2
socket ×2
audit ×1
bash ×1
disk-usage ×1
files ×1
limit ×1
logs ×1
networking ×1
proc ×1
shell ×1
ulimit ×1
unmounting ×1