随着最近转向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开始并包含字符串的其余部分,因此它会丢弃字符零.
第二个循环只是一个演示迭代数组的演示.