Linux:在Bash脚本中读取readlink / proc / pid / exe的输出

时间:2015-06-01 13:49:59

标签: linux bash linux-kernel procfs

所以我正在编写一个bash脚本,它将运行/ proc / [pid]中的所有进程ID并读取用于运行它的可执行文件。

从我看过的内容来看,/ proc文件系统包含/ proc / [pid] / exe符号链接。在bash脚本中,我正在尝试解决如何读取" readlink / proc / [pid] / exe"的值。检查是否(删除)或没有返回任何内容,以确定磁盘上是否存在原始可执行文件。

到目前为止,有没有办法做到这一点?

#!/bin/bash
pid = "0"

while [ $pid -lt 32769 ]
do
    if [-d /proc/$pid]; then
        if [-f /proc/$pid/exe]; then
            echo $pid
            readlink /proc/$pid/exe
        fi
    fi
    pid = $[$pid+1]
done

这无法正常工作并且总是不返回任何内容。我正在尝试列出所有不再在磁盘上提供可执行文件的进程。

4 个答案:

答案 0 :(得分:0)

我已更新您的脚本以使其正常运行。请注意-f检查文件名是否代表常规文件。我会为一个符号链接返回false:

pid="0"
while [ $pid -lt 32769 ]
do
    if [ -d /proc/$pid ]; then
        if [ -h /proc/$pid/exe ]; then
            echo $pid
            readlink /proc/$pid/exe
        fi
    fi
    pid=$[$pid+1]
done

答案 1 :(得分:0)

你可以通过打印$来读取shell中的任何命令后的返回值吗?变量:

 readlink
 echo $?

如果链接无效,$?将大于0。

但是,如果存在链接并且删除了实际文件,则可以使用以下内容:

ls `readlink somelink`

答案 2 :(得分:0)

这对你有用吗?

#!/bin/bash

for i in $(ls /proc | awk '/^[[:digit:]]+/{print $1}'); do
  if [ -h /proc/$i/exe ]; then
    echo -n "$i: "
    if readlink /proc/$i/exe >/dev/null 2>&1 ; then
      echo "executable exists"
    else
      echo "executable not found"
    fi
  fi
done

答案 3 :(得分:0)

   readlink -f `ls --dereference /proc/$pid/exe`