我正在尝试使用ps aux命令列出真正的ssh-agent进程。我注意到在某些发行版上,我会看到不需要的进程,比如命令颜色等等。我需要这样做,因为我需要确保真正的ssh-agent进程在脚本中运行(不要打扰,我已经有了一个循环...)。
所以我发现我需要在我的测试程序中使用类似的东西:
#!/bin/bash
ps aux | grep ssh-agent | grep -v grep | awk '{print $12}'
我的问题是:awk $ 12是否可以在任何使用bash版本的bash上使用任何unix / linux环境?
另外,如果我删除“grep -v grep”并执行此操作:
ps aux | grep ssh-agent | awk '{print $12}'
输出是:
ssh-agent
ssh-agent
现在:
ps aux | grep ssh-agent
输出是:
foo 18153478 0.0 0.0 536 844 - A Apr 25 0:00 ssh-agent
foo 31260886 0.0 0.0 252 264 pts/0 A 22:38:41 0:00 grep ssh-agent
这意味着,“grep ssh-agent”之间的空格被awk命令解释为分隔符。 Aynthing有可能克服这个问题吗?我已经尝试过使用制表符分隔符,但事实并非如此。看起来命令的分隔符是简单的“空格”字符。是否可以为“ps”命令输出强制使用制表符分隔符?
有什么想法吗?
答案 0 :(得分:2)
首先$ 12与ps输出的字段数相关联。它与bash无关。
grep -v grep
是删除grep进程的好方法,所以请将其保留;
现在你不确定最后一个字段是字段12还是什么,我不太确定
ps aux | grep ssh-agent | grep -v grep | awk '{ print $NF }'
假设您只想查看ssh-agent(并且它没有命令行参数)
这里有一些快速而又脏的东西会吐出pid和完整的命令行
ps aux | grep ssh-agent | grep -v grep | awk '{ print $1 " "; for (k = 12; k < NF; k++ ) { printf "%s", k; } printf "\n"; }'
NF是awk中的字段数,因此$ NF是最后一个字段。
看看这是否适合你。有更清洁的方法来做到这一点
答案 1 :(得分:2)
好吧我想我找到了它,非常简单明了:
ps -e -o pid,comm | grep ssh-agent
工作得很好。
并改编为| grep ssh-agent
马丁也提出了建议。谢谢大家分享你的经验!
答案 2 :(得分:1)
我建议grep
表示'[s]sh-agent'
。这样您就无法获得grep
本身。
我还建议不要使用awk
(打印第12列),而是使用cut
打印行的特定字符范围,例如: G:
ps aux | grep '[s]sh-agent' | cut -c 66-
这取决于ps
的输出格式。
您可以改为查看/proc/
文件系统:
(
cd /proc
for p in [0-9]*
do
[ "$(readlink $p/exe)" = "/bin/bash" ] &&
echo "$p $(cat $p/cmdline | tr '\0' ' ')"
done
)
(当然,使用......更合适而不是/bin/bash
。)
另一方面,这将取决于/proc/
文件系统的存在。决定自己哪个更适合你。