![按目录中的所有文件名进行 Grep](https://linux22.com/image/1494547/%E6%8C%89%E7%9B%AE%E5%BD%95%E4%B8%AD%E7%9A%84%E6%89%80%E6%9C%89%E6%96%87%E4%BB%B6%E5%90%8D%E8%BF%9B%E8%A1%8C%20Grep.png)
我想获取给定目录中正在运行的所有服务的进程状态。现在我可以逐个检查ps -ef | grep ServiceName
。但是有没有办法获取ls
目录和ps
每个服务?
就像是ps -ef | grep < ls
?
答案1
已经将其作为评论发布,这应该可以满足您的要求:
ps -ef | grep "$(ls)"
答案2
在 Bash 中:
ps -ef | grep "$(ls)"
(当我在 Debian/Bash 中编写和测试我的其余答案时,同一行也出现在 incBrain 的评论中。)
如果模式ps
作为命令行参数(而不是命令)或命令的一部分出现在输出中,则会产生垃圾。为了减少这种情况,我将使用find
而不是ls
获取完整路径:
ps -ef | grep -f <(find -L "$(pwd)" -maxdepth 1 -type f)
仍然可能存在一些不必要的额外输出。
请注意,这些不是
在给定目录中运行的服务
相当指定目录中具有可执行文件的进程。
要了解进程的当前工作目录,您可以阅读/proc/<PID>/cwd
。下一个示例是(快速而粗糙的)ps
替代方法,它表明您可以从/proc
所需的形式中提取信息:
sudo bash -c 'for i in /proc/[1-9]* ; do PID=$(basename "$i"); E=$(readlink "${i}/exe"); D=$(readlink "${i}/cwd"); echo -e "PID=${PID}\tEXE=${E}\tCWD=${D}" ; done | grep "CWD=$(pwd)$"'
您需要sudo
获得所有进程的访问权限。如果这没有必要,并且您想以普通用户身份运行它,那么分隔符内的部分'
就足够了。
答案3
也许是这样的:
processes="$(ps -ef)"
for file in *;do
grep "$file" <<<"$processes"
done