从lsof中拉取字段/属性(Linux命令行)

随着最近转向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开始并包含字符串的其余部分,因此它会丢弃字符零.

第二个循环只是一个演示迭代数组的演示.

相关文章

用的openwrt路由器,家里宽带申请了动态公网ip,为了方便把2...
#!/bin/bashcommand1&command2&wait从Shell脚本并行...
1.先查出MAMP下面集成的PHP版本cd/Applications/MAMP/bin/ph...
1、先输入locale-a,查看一下现在已安装的语言2、若不存在如...
BashPerlTclsyntaxdiff1.进制数表示Languagebinaryoctalhexa...
正常安装了k8s后,使用kubect工具后接的命令不能直接tab补全...