我想知道更多有关的高级应用/proc
和/sys
虚拟文件系统,但我不知道从哪里开始。任何人都可以建议任何好的学习来源吗?此外,由于我认为 sys 有定期添加,因此在发布新内核时保持我的知识最新的最佳方法是什么。
我正在编写一个 Perl 脚本,它解析日志文件以收集 PID,然后检查该 PID 是否正在运行。我正在努力想出最好的方法来进行检查。显然,我可以这样做:
system("ps $pid > /dev/null") && print "Not running\n";
Run Code Online (Sandbox Code Playgroud)
但是,如果可能,我更愿意避免系统调用。因此,我认为我可以使用/proc
文件系统(可移植性不是问题,这将始终在 Linux 系统上运行)。例如:
if(! -d "/proc/$pid"){
print "Not running\n";
}
Run Code Online (Sandbox Code Playgroud)
那安全吗?我可以总是假设如果没有/proc/$pid/
目录关联的 PID 没有运行吗?我希望如此,因为 AFAIKps
本身从/proc
任何方式获取信息,但由于这是用于生产代码,我想确定。
那么,是否存在正在运行的进程没有/proc/PID
目录或/proc/PID
目录存在但进程没有运行的情况?是否有任何理由更喜欢解析而ps
不是检查目录是否存在?
如果这不是这个问题的最佳论坛,请原谅我,但它似乎与内核相关而不是与编程本身相关。
我正在编写一个脚本来查询系统的开放端口,以便我们可以绘制和监视统计信息。为此,我使用了 iproute 包中的“ss”命令。如果执行,ss -s|grep estab
您将收到类似于以下内容的输出:
TCP: 296 (estab 6, closed 238, orphaned 0, synrecv 0, timewait 238/0), ports 0
Run Code Online (Sandbox Code Playgroud)
我的问题与 timewait 变量有关,它显示了 TIME_WAIT 状态下的计算套接字。当我试图找出斜线后引用的数字时,它变成了搜索源代码的旋风冒险,最终让我找到了以下代码段:
printf("TCP: %d (estab %d, closed %d, orphaned %d, synrecv %d, timewait %d/%d), ports %d\n",
s.tcp_total + slabstat.tcp_syns + s.tcp_tws,
sn.tcp_estab,
s.tcp_total - (s.tcp4_hashed+s.tcp6_hashed-s.tcp_tws),
s.tcp_orphans,
slabstat.tcp_syns,
s.tcp_tws, slabstat.tcp_tws,
slabstat.tcp_ports
);
Run Code Online (Sandbox Code Playgroud)
我必须承认,我对“slabstat”应该意味着什么的搜索最终导致我了解了 /proc/slabinfo 中的平板缓存及其报告界面。
问题:slabtable 与 TIME_WAIT 套接字计算有什么关系?我不明白为什么报告这个数字,因为每次我在我尝试过的每台服务器上运行命令时,这个数字总是零。
我的电脑上安装了 Ubuntu。我决定安装 Arch linux,但我跳过了关于 Grub 安装的部分,因为它已经安装了。看到 Arch 没有出现在 Grub 的菜单列表中,我决定在 Arch 中安装它。我在 Ubuntu 中安装了 Arch 的分区,然后 chroot 到它。我发出命令pacman -S grub-bios
并得到以下信息:
error: could not open file: /etc/mtab: No such file or directory
error: could not determine filesystem mount points
error: failed to commit transaction (unexpected error)
Errors occurred, no packages were upgraded.
Run Code Online (Sandbox Code Playgroud)
/etc/mtab
是指向 的符号链接/proc/self/mounts
,但/proc
文件夹中没有任何内容。
我究竟做错了什么?
作为补充,我是否朝着正确的方向让 Arch 出现在 Grub 的列表中?编辑:我是能够使拱门出现在GRUB的名单从Ubuntu的做sudo mount /dev/sdaX
(与Arch的分区号替换X之前)sudo update-grub
。
我试图找到如何记录特定实例化rrdtool
以查看它接收的路径是否不正确。
我知道我可以将可执行文件包装在一个可以记录参数的 shell 脚本中,但我想知道是否有一种更特定于内核的方法来监视它,也许是一个文件系统回调,可以看到特定的 /proc/pid/exe匹配给定的二进制文件?
给定 2.6.x 或更新的 Linux 内核和能够同时运行 ELF32 和 ELF64 二进制文件的现有用户空间(即过去我怎么知道我的 CPU 在 Linux 下支持 64 位操作系统?)我如何确定给定的进程( PID) 是在 32 位还是 64 位模式下运行?
天真的解决方案是运行:
file -L /proc/pid/exe | grep -o 'ELF ..-bit [LM]SB'
Run Code Online (Sandbox Code Playgroud)
但该信息是否直接暴露在/proc
不依赖的情况下libmagic
?
是否需要访问硬盘驱动器还是所有操作都在内存中完成?基本上我想不断从 meminfo 和 cpuinfo 获取更新的值。
我是否需要重新打开文件然后重新读取才能获得更新的值,还是可以重新读取?我目前无法访问 Linux 安装。
谁能向我解释一下EV
in的价值/proc/bus/input/devices
是什么?
键盘总是有价值的120013
。为什么?
我在 bash 中编写了一个小“守护进程”,如果检测到它们,它将切换到耳机,如果没有,则切换到带有 PulseAudio 的外部 USB 扬声器。
我正在寻找的是某种方式来获取文件更改的通知/proc/asound/card0/codec#0
,就像inotifywait
在真实文件上一样(将 /proc 下的文件视为“伪文件”)。
我找到我的代码有点疯狂,因为它运行sleep 1
与awk
整个一天,也就是86400次,每天:)
while sleep 1; do
_1=${_2:-}
_2=$(awk '/Pin-ctls/{n++;if(n==4)print}' '/proc/asound/card0/codec#0')
[[ ${_1:-} = $_2 ]] ||
if [[ $_2 =~ OUT ]]; then
use_speakers
else
use_internal
fi
done
Run Code Online (Sandbox Code Playgroud)
我正在寻找的是类似的东西(这个例子不起作用):
codec=/proc/asound/card0/codec#0
while inotifywait $codec; do
if [[ $(awk '/Pin-ctls/{n++;if(n==4)print}' $codec) =~ OUT ]]; then
use_speakers
else
use_internal
fi
done
Run Code Online (Sandbox Code Playgroud)
这样,只有在$codec
文件发生实际更改时,才会运行循环内的命令。
据我了解,如果我输入以下内容...
python -i
Run Code Online (Sandbox Code Playgroud)
... python 解释器现在将从标准输入读取,行为(显然)如下:
>>> print "Hello"
Hello
Run Code Online (Sandbox Code Playgroud)
如果我这样做,我希望它做同样的事情:
echo 'print "Hello"' > /proc/$(pidof python)/fd/0
Run Code Online (Sandbox Code Playgroud)
但这是输出(beeing 一个实际的空行):
>>> print "Hello"
<empyline>
Run Code Online (Sandbox Code Playgroud)
这对我来说看起来像,它只是把它print "Hello"\n
写到了 stdout
,但没有解释它。为什么这不起作用,我必须做些什么才能使它起作用?