对不起,这个问题有几个层次,但都处理打开文件的数量。
我在我正在开发的应用程序的应用程序日志中收到“打开的文件太多”消息。有人建议我:
我跑了ulimit -n,它返回 1024。我还查看了 /etc/limits.conf,该文件中没有任何特殊内容。/etc/sysctl.conf 也没有修改。我将在下面列出文件的内容。我也跑了lsof | wc -l,它返回了 5000+ 行(如果我使用正确的话)。
所以,我的主要问题是:
limit.conf 的内容
# /etc/security/limits.conf
#
#Each line describes a limit for a user in the form:
#
#<domain> <type> <item> <value>
#
#Where:
#<domain> can be:
# - an user name
# - a group name, with @group syntax
# - the wildcard …Run Code Online (Sandbox Code Playgroud) 我已经运行了命令
sudo lsof -i tcp:46265
Run Code Online (Sandbox Code Playgroud)
产量
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
mysqld 4580 mysql 30u IPv4 70185524 0t0 TCP localhost:mysql->localhost:46265 (ESTABLISHED)
java 53105 root 54u IPv6 70185523 0t0 TCP localhost:46265->localhost:mysql (ESTABLISHED)
Run Code Online (Sandbox Code Playgroud)
有人可以解释一下localhost:mysql-> localhost:46265 和localhost:46265-> localhost:mysql 是什么意思?
使用fcntl(非阻塞)或某种自定义方式锁定文件.所以我正在使用lsof并检查进程的pid是否在那里.如果lsof返回空白而不是没有使用它.
但是我的脚本中的lsof需要200ms.
在Windows上,当我尝试测试文件是否被锁定时,我只是打开文件,如果错误锁定,则需要5ms.是否有任何替代lsof进行快速测试,看看是否有东西被持有文件?
当我运行时pgrep vim | xargs echo,它打印93868 91234。
当我运行时lsof -p 91234,它打印:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
vim 91234 rose cwd DIR 1,2 1326 1186863 /Users/rose/spotapi/spotapi/models
vim 91234 rose txt REG 1,2 1629296 12231 /usr/bin/vim
vim 91234 rose txt REG 1,2 2704416 294199 /System/Library/Frameworks/Python.framework/Versions/2.7/Python
Run Code Online (Sandbox Code Playgroud)
那么为什么呢
pgrep vim | xargs lsof -p
Run Code Online (Sandbox Code Playgroud)
打印
lsof: status error on 91234: No such file or directory
Run Code Online (Sandbox Code Playgroud)
我在 Mac 操作系统上运行。
问题是,我想跟踪用户是否尝试在共享帐户上打开文件.我正在寻找任何记录/技术,帮助我知道在运行时是否打开了相关文件.
我想创建一个脚本来监视文件是否打开,如果是,我希望它向特定的电子邮件地址发送警报.我正在考虑的文件是一个常规文件.
我试过lsof | grep filename用来检查文件是否在gedit中打开,但命令没有返回任何内容.
实际上,我正在尝试这个宠物项目,因此问题.
使用lsof命令,我可以确定某个进程是否正在使用某个文件,但是我需要自动检查文件以供使用,并且仅在未使用时才移动它.这些文件正由我无法控制的各种其他程序使用,所以我不能使用咨询锁.目的是阻止其他进程修改该文件,因此只需在进程打开时移动该文件就不行了.有解决方案吗
更新:我认为我认为适合我的目的的解决方案.最终目标是在其他程序完成修改后将这些文件处理为最终状态.如果我将文件移动到另一个目录,我可以使用lsof通过其旧路径检查它是否仍在使用中; 如果是这样,我只是稍后再检查,直到它不再使用,然后处理文件.通过将文件移动到另一个目录,它会隐藏用户和程序中的文件.我不希望用户和程序在旧目录中看到该文件,因为这使他们有机会在我使用lsof和处理文件之间打开文件,这意味着我将以修改状态处理文件.
我的路由器指示我运行的应用程序已打开一个TCP端口(6183)(我不知道)
使用lsof(在这里回答)lsof -iTCP:6183 -sTCP:LISTEN,我发现launchd是罪魁祸首.
是否有可能找出launchd的'脚本'中的哪一个负责?
我想在其中找到lsof"Google"中的所有行,所以我尝试了以下内容:
lsof | awk '/.*google.*/ { print $1 "," $2 "," $3} ' > new_file.csv
Run Code Online (Sandbox Code Playgroud)
这会正确地产生一个以"google"开头的行的输出.
但是,然后我尝试这个,而csv什么都不包含:
lsof | awk '/\s*google.*/ { print $1 "," $2 "," $3} ' > new_file.csv
Run Code Online (Sandbox Code Playgroud)
但是,我认为这\s*意味着任意数量的空间.这种行为有什么理由吗?谢谢.
我正在尝试以更可解析的方式格式化 lsof 输出。
背景:由于并非所有打开句柄的进程都有线程 ID,因此不一定确定由空格(空白 AFAIS)分隔的字段数量。
作为输出字段,我需要 PID、UID/用户名和路径(如果它是一个文件 - 我正在查找路径,因为 +D 非常慢)。
作为字段分隔符,我从 NL 切换到 NUL(并用“|”替换 null 以提高可读性)
所以我尝试了
> /usr/sbin/lsof -F pnuf0 | sed 's/\x0/|/g' | grep "cvmfs" | tail -n 2
ftxt|n/usr/bin/cvmfs2|
fmem|n/usr/lib64/libcvmfs_fuse.so.2.3.5|
Run Code Online (Sandbox Code Playgroud)
它只产生文件描述符和名称(不是按照给定的顺序?)而不是 PID 或 UID?
作为旁注,单独选择 PID 和 UID 字段时,它们显然已经是“空”
> /usr/sbin/lsof -F u0 | sed 's/\x0/|/g' | grep "cvmfs" | tail -n 2
> /usr/sbin/lsof -F p0 | sed 's/\x0/|/g' | grep "cvmfs" | tail -n 2
> /usr/sbin/lsof -F n0 | sed 's/\x0/|/g' | …Run Code Online (Sandbox Code Playgroud) 我正在尝试运行rails server以启动本地服务器但出现此错误
...
WARN TCPServer Error: Address already in use - bind(2)
Exiting
...
Run Code Online (Sandbox Code Playgroud)
所以我去寻找占据港口并杀死它的进程.服务器仍然无法启动.事实证明,lsof仍然显示了这个过程(即使它已被杀死):
$ lsof -P | grep ':3000'
ruby 52944 user 7u IPv4 0xffffff800bdafbd8 0t0 TCP *:3000 (LISTEN)
$ kill 52944 <<<<<<< pid 52944 should have died here!
$ lsof -P | grep ':3000'
ruby 52944 user 7u IPv4 0xffffff800bdafbd8 0t0 TCP *:3000 (LISTEN)
Run Code Online (Sandbox Code Playgroud)
知道如何真正杀死这个过程吗?
(这是打开的OSX)
我想用lsof获得不同的结果,我的意思是只想显示一些列,是否可能?
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
init 1 root cwd DIR 8,1 4096 2 /
init 1 root rtd DIR 8,1 4096 2 /
init 1 root txt REG 8,1 36992 139325 /sbin/init
init 1 root mem REG 8,1 14696 190970 /lib/libdl-2.11.3.so
init 1 root mem REG 8,1 1437064 190958 /lib/libc-2.11.3.so
Run Code Online (Sandbox Code Playgroud) 我想杀死与 tcsh shell 中的进程相关的 PID 列表。我运行了以下命令:
> losf <file> | awk '{print($2)"'
Run Code Online (Sandbox Code Playgroud)
该命令将显示 PID 列表。
PID1
PID2
...
然后我运行以下命令来杀死这些 PID。
> kill -9 `lsof <file> | awk'{print($2)}'`
Run Code Online (Sandbox Code Playgroud)
当执行该kill命令时,终端只是以某种方式挂起,而没有杀死任何 PID。然后我不得不恢复一一杀死那些 PID。
因此,有没有一种方法可以实现我想要做的事情,如上所示?谢谢。