标签: proc

我如何了解我可以用 /proc 和 /sys 做什么

我想知道更多有关的高级应用/proc/sys虚拟文件系统,但我不知道从哪里开始。任何人都可以建议任何好的学习来源吗?此外,由于我认为 sys 有定期添加,因此在发布新内核时保持我的知识最新的最佳方法是什么。

linux kernel proc sysfs

16
推荐指数
2
解决办法
949
查看次数

我应该如何检查给定的 PID 是否正在运行?

我正在编写一个 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不是检查目录是否存在?

process perl process-management proc

16
推荐指数
2
解决办法
7774
查看次数

iproute 包中的“ss”命令;为什么要查询时间等待套接字的slab表?

如果这不是这个问题的最佳论坛,请原谅我,但它似乎与内核相关而不是与编程本身相关。

我正在编写一个脚本来查询系统的开放端口,以便我们可以绘制和监视统计信息。为此,我使用了 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 套接字计算有什么关系?我不明白为什么报告这个数字,因为每次我在我尝试过的每台服务器上运行命令时,这个数字总是零。

networking proc socket

15
推荐指数
1
解决办法
1533
查看次数

Arch linux:chroot 时 pacman 不起作用

我的电脑上安装了 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

arch-linux pacman grub2 proc

15
推荐指数
1
解决办法
2万
查看次数

有没有一种简单的方法来记录所有执行的命令,包括命令行参数?

我试图找到如何记录特定实例化rrdtool以查看它接收的路径是否不正确。

我知道我可以将可执行文件包装在一个可以记录参数的 shell 脚本中,但我想知道是否有一种更特定于内核的方法来监视它,也许是一个文件系统回调,可以看到特定的 /proc/pid/exe匹配给定的二进制文件?

logs proc audit arguments

15
推荐指数
2
解决办法
2万
查看次数

确定特定进程是 32 位还是 64 位

给定 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

linux 64bit elf proc

15
推荐指数
2
解决办法
1万
查看次数

当我打开并读取 /proc 时会发生什么?

是否需要访问硬盘驱动器还是所有操作都在内存中完成?基本上我想不断从 meminfo 和 cpuinfo 获取更新的值。

我是否需要重新打开文件然后重新读取才能获得更新的值,还是可以重新读取?我目前无法访问 Linux 安装。

monitoring system-information proc

14
推荐指数
2
解决办法
1万
查看次数

解释/proc/bus/input/devices数据中的EV

谁能向我解释一下EVin的价值/proc/bus/input/devices是什么?

键盘总是有价值的120013。为什么?

linux devices proc events

14
推荐指数
1
解决办法
1万
查看次数

通知 /proc 下文件的更改

我在 bash 中编写了一个小“守护进程”,如果检测到它们,它将切换到耳机,如果没有,则切换到带有 PulseAudio 的外部 USB 扬声器。

我正在寻找的是某种方式来获取文件更改的通知/proc/asound/card0/codec#0,就像inotifywait在真实文件上一样(将 /proc 下的文件视为“伪文件”)。

我找到我的代码有点疯狂,因为它运行sleep 1awk整个一天,也就是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文件发生实际更改时,才会运行循环内的命令。

proc inotify

14
推荐指数
2
解决办法
1万
查看次数

写入进程的标准输入

据我了解,如果我输入以下内容...

 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,但没有解释它。为什么这不起作用,我必须做些什么才能使它起作用?

file-descriptors proc

14
推荐指数
3
解决办法
3万
查看次数