Ric*_*nez 3 linux bash flv command-line
随着最近转向Flash 10(或者它可能是一个发行版选择),我和许多其他人不再能够从/ tmp复制Flash视频.但是,我发现了以下解决方法:
首先,执行:
lsof | grep Flash
Run Code Online (Sandbox Code Playgroud)
应该像这样返回输出:
plugin-co 8935 richard 16w REG 8,1 4139180 8220 /tmp/FlashXXq4KyOZ (deleted)
Run Code Online (Sandbox Code Playgroud)
注意:您可以在此处看到问题..../tmp文件已释放文件指针.
但是,您可以通过使用cp命令来获取文件:
cp /proc/#/fd/# video.flv
Run Code Online (Sandbox Code Playgroud)
其中第一个#是进程ID(8935),第二个是下一个数字(16,从16w).
目前,这是有效的,但它需要一些手动步骤.为了自动执行此操作,我想我可以拉出PID和fd编号并将它们动态插入到cp命令中.
我的问题是如何将适当的字段拉入变量?我知道你可以使用$ 1等来获取输入参数,但是你如何检索输出?
注意:我可以pidof plugin-container
用来查找PID,但我仍然需要另一个数字(因为它告诉哪个特定的Flash视频要保存).
以下命令将返回文件/tmp
名以"Flash"开头的所有文件的PID和FD
lsof -F pfn /tmp/Flash*
Run Code Online (Sandbox Code Playgroud)
输出看起来像这样:
p16471
f16
n/tmp/FlashXXq4KyOZ
f17
n/tmp/FlashXXq4KyOZ
p26588
f16
n/tmp/FlashYYh3JwIW
f17
Run Code Online (Sandbox Code Playgroud)
字段标识符为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
Run Code Online (Sandbox Code Playgroud)
像这样的行:
fds[pids[c]]+=${line:1}" "
Run Code Online (Sandbox Code Playgroud)
在存储在由PID索引的数组中的字符串中累积文件描述符.对于包含空格的文件名,对文件名执行此操作将失败.如有必要,可以解决这个问题.
通过使用子字符串运算符去除行前导字段描述符字符:${line:1}
从第一个位置开始并包含字符串的其余部分,使其删除字符零.
第二个循环只是一个演示迭代数组的演示.
归档时间: |
|
查看次数: |
4500 次 |
最近记录: |