- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我想拍下我的整个 proc 文件系统的快照,并将其保存在压缩包中(或者在最坏的情况下将所有文本文件连接到一个文本文件中)。
但是当我运行时:
tar -c /proc
我遇到段错误。
执行此操作的最佳方法是什么?我应该设置某种递归遍历每个文件吗?
我只有基本的 *nix 实用程序,例如 bash、cat、ls、echo 等。我没有像 python 或 perl 或 java 这样花哨的东西。
最佳答案
linux/proc 文件系统实际上是伪装成文件系统的内核变量。没有什么可以保存,因此没有什么可以备份。如果系统允许,你可以rm -rf /proc
它会在下次重新启动时神奇地重新出现。
/dev 文件系统有真正的 i-nodes 并且它们可以被备份。除了它们没有内容,只有主要和次要编号、权限和名称。备份特殊设备文件的工具只记录这些参数,从不尝试打开 (2) 设备。然而,由于设备的主要和次要编号仅在它们所针对的精确系统上才有意义,因此没有理由备份它们。
尝试 tar/proc 伪文件系统导致 tar 出现段错误的原因是因为/proc 具有有趣的文件行为:诸如只写伪文件之类的东西可能看起来具有读取权限,但如果一个程序试图打开(2)它进行备份。这肯定会驱使天真的 tar 变得小气。
我并不惊讶 tar 在读取/proc/kmsg 时遇到问题,因为它有一些有趣的属性:
# strace cat /proc/kmsg
execve("/bin/cat", ["cat", "kmsg"],
open("kmsg", O_RDONLY|O_LARGEFILE) = 3
// ok, no problem opening the file for reading
fstat64(3, { st_mode=S_IFREG|0400, st_size=0,
// looks like a normal file of zero length
// but cat does not pay attention to st_size so it just
// does a blocking read
read(3, "<4>[103128.156051] ata2.00: qc t"..., 32768) = 461
write(1, "<4>[103128.156051] ata2.00: qc t"..., 461) = 461
// ...forever...
read(3, "<6>[103158.228444] ata2.00: conf"..., 32768) = 48
write(1, "<6>[103158.228444] ata2.00: conf"..., 48) = 48
+++ killed by SIGINT +++
因为/proc/kmsg 是内核消息发生时的运行列表,它永远不会返回 0 (EOF),它会一直运行,直到我感到无聊并按 ^C。
有趣的是,我的 tar 在/proc/kmsg 上没有问题:
$ tar --version
tar (GNU tar) 1.22
# tar cf /tmp/junk.tar /proc/kmsg
$ tar tvf /tmp/junk.tar
-r-------- root/root 0 2010-09-01 14:41 proc/kmsg
如果您查看 strace 输出,GNU tar 1.22 会看到 st_length == 0 并且甚至懒得打开文件进行读取,因为那里什么都没有。
我可以想象你的 tar 看到长度为 0,使用 malloc(3) 分配了那么多(无)空间,它尽职尽责地交还了一个指向零长度缓冲区的指针。您的 tar 从/proc/kmsg 读取,获得了非零长度读取,并试图将其存储在零长度缓冲区中,但出现了分段违规。
那只是在/proc 中等待 tar 的一个老鼠洞。还有多少?不知道。他们的行为会相同吗?可能不是。 ~1000 个左右的文件中哪些不是 /proc/<pid>
伪文件会有奇怪的语义?不知道。
但也许最有说服力的问题是:您认为/proc/sys/vm/lowmem_reserve_ratio 有什么意义,下周它会有所不同吗?您能从这种差异中学到什么吗?
关于linux - 我如何压缩 proc 文件系统?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3630976/
在经历了DDOS攻击后,不知何故/proc/kcore非常巨大,我使用一个小的php类来检查当前的磁盘空间,以及已经使用了多少。 它显示以下内容: Total Disk Space: 39.2 GB
所以我从 ruby 移植了一个工具,可以在对象上定义回调 block ,我希望在设置回调的情况下调用它。所以基本上是这样的。 def set_block(&block) @new_kid_on
我定义了两个脚本:第一个脚本调用第二个脚本中的 proc。第二个脚本定义了一个命名空间 fooSpace , 定义了一个变量 fooValue内fooSpace , 并定义了一个过程 myProc内f
使用一个 proc 时,我的脚本工作正常(检索 sftp 提示)。但是当我尝试在 proc 中使用 proc 时,脚本卡住了,我不知道为什么。 请不要重构代码,这不是重点,我需要了解这里的问题。 工作
我想知道是否有一种方法可以识别某些proc文件中用于DMA映射的内存,例如mtrr和iomem,或者通过lspic -vv . 在我的/proc/mtrr中,只有一个无法缓存区域,它似乎几乎指向3.5
我有 2 个过程,它们一个接一个地调用。第一个过程使用 diff 功能并创建 file.txt。压缩文件后的过程。问题是当我运行脚本时,file.txt 是空的。当我注释掉压缩过程时,文件中打印了差异
我曾经认为 /proc/self 和 /proc/$$ 在 bash 终端中是一样的,但现在我发现它们是不同的。 我知道$$是当前进程的pid,/proc/self是当前运行的进程,应该是bash终端
在下面的程序中,我想在第 2 个过程中捕获数据包,而 ping 在第 1 个过程中运行。现在,如果我执行这个程序,proc 正在运行 ping 并退出它。有解决此问题的想法吗? 我的 TCL 代码:
在 proc 中,您可以获得 proc 名称(无需对其进行硬编码)吗?例如 proc my_proc { some_arg } { puts "entering proc [some way
我有一个自定义的 A10 存储库,我试图在其中创建一个能够读取 /proc/[pid]/some-file 的应用程序文件,例如stat和 status ,有点像 ps做。 看完这篇 answer很明
我是 TCL 的新人。我通过 Windows Vista 下的 DOS 窗口“tclsh85 FOD/Scripts/program1.tcl”执行 TCL 代码。 program1.tcl 包含“s
我想查看每个进程的精确内存量用作匿名页,因为匿名内存不能调出,因此精确跟踪此使用情况非常重要。 获取匿名页面总数的一种方法是读取/proc/meminfo AnonPages。 另一种方法是将 sma
在 Ruby 中,Proc.new { 'waffles' } 和 proc { 'waffles' } 之间有什么区别吗?我发现很少有人提到第二种语法。 使用 irb 进行测试,我没有发现任何明显的
我正在寻找有关Linux系统上/proc/net/nf_conntrack和/或/proc/net/ip_contrack文件内容的详细文档。 是的,我知道,有许多实用程序可以用人类可读的格式向我显示
而不是执行多个单独的 PROC FREQ一个非常大的数据集上的程序,我想通过执行单个 PROC FREQ 来提高效率与多个 TABLE声明。我们的 QA 流程需要表格标题,这很简单,只需一个 TABL
我想在 /proc/driver 下创建一个文件目录。我想使用像 proc_root_driver 这样的宏(或提供的其他东西)而不是明确使用“驱动程序/模块名称”。我用 create_proc_en
在 SQL Server 2005 中,我希望名为 LimitedUser 的用户只能运行一个过程: GRANT EXEC ON [usp_RunETL] TO [LimitedUser] 但是,该
考虑到以下两个过程: proc firstOne(): void = echo "X" proc secondOne(): void = echo "X" discard 它们
我想使用 PROC TABULATE 复制 PROC MEANS 的输出。原因是我希望将利润百分比(或利润率)作为 PROC MEANS 输出中的变量之一,但希望抑制一个或多个统计数据的计算,即会有一
我的目标是使数据适合具有正支持的任何分布。 (威 bool (2p)、 Gamma (2p)、帕累托 (2p)、对数正态 (2p)、指数 (1P))。第一次尝试,我使用了 proc univariat
我是一名优秀的程序员,十分优秀!