随着最近迁移到 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 视频)。
以下命令将返回 PID 和 FD 中的所有文件/tmp
文件名以“Flash”开头的文件
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}
从位置一开始并包含字符串的其余部分,因此它会删除字符零。
第二个循环只是一个演示,用于展示对数组的迭代。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)