gpt4 book ai didi

linux - 从 lsof(Linux 命令行)中提取字段/属性

转载 作者:IT王子 更新时间:2023-10-29 01:03:35 28 4
gpt4 key购买 nike

随着最近转向 Flash 10(或者可能是发行版的选择),我和许多其他人不再能够从/tmp 复制 Flash 视频。但是,我在以下方面找到了解决方法:

首先,执行:

lsof | grep Flash

应该返回这样的输出:

plugin-co 8935    richard   16w      REG        8,1   4139180       8220 /tmp/FlashXXq4KyOZ (deleted)

注意:您可以在此处看到问题..../tmp 文件已释放文件指针。

但是,您可以使用 cp 命令抓取文件:

cp /proc/#/fd/# video.flv

第一个 # 是进程 ID (8935),第二个是下一个数字(16,来自 16w)。

目前,这可行,但需要一些手动步骤。为了自动执行此操作,我想我可以提取 PID 和 fd 编号并将它们动态插入到 cp 命令中。

我的问题是如何将适当的字段拉入变量?我知道您可以使用 $1 等来获取输入参数,但是您如何检索输出?

注意:我可以使用 pidof plugin-container 找到 PID,但我仍然需要另一个数字(因为它告诉我要保存哪个特定的 Flash 视频)。

最佳答案

以下命令将返回 /tmp 中文件名以“Flash”开头的所有文件的 PID 和 FD

lsof -F pfn /tmp/Flash*

输出看起来像这样:

p16471
f16
n/tmp/FlashXXq4KyOZ
f17
n/tmp/FlashXXq4KyOZ
p26588
f16
n/tmp/FlashYYh3JwIW
f17

其中字段标识符为p:PID,f:FD,n:NAME。 -F 选项旨在使 lsof 的输出易于解析。

迭代这些并删除字段标识符是微不足道的。

#!/bin/bash
c=-1
while read -r line
do
case $line in
f*)
fds[pids[c]]+=${line:1}" "
;;
n*)
names[pids[c]]+=${line:1}" "
;;
p*)
pids[++c]=${line:1}
;;
esac
done < <(lsof -F pfn -- /tmp/Flash*)

for ((i=0; i<=c; i++))
do
for name in ${names[pids[i]]}
do
for fd in ${fds[pids[i]]}
do
echo "File: $name, Process ID: ${pids[i]}, File Descriptor: $fd"
done
done
done

像这样的行:

fds[pids[c]]+=${line:1}" "

将文件描述符累积到存储在由 PID 索引的数组中的字符串中。对包含空格的文件名执行此操作将失败。如有必要,可以解决这个问题。

该行通过使用子字符串运算符去除前导字段描述符:${line:1} 从位置 1 开始并包括字符串的其余部分,因此它删除字符零。

第二个循环只是一个展示遍历数组的演示。

关于linux - 从 lsof(Linux 命令行)中提取字段/属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5061328/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com