如何在标头就位的情况下 grep PS 输出?
这两个进程组成了一个在我的服务器上运行的应用程序......
root 17123 16727 0 16:25 pts/6 00:00:00 grep GMC
root 32017 1 83 May03 ? 6-22:01:17 /scripts/GMC/PNetT-5.1-SP1/PNetTNetServer.bin -tempdir /usr/local/GMC/PNetT-5.1-SP1/tmpData -D
Run Code Online (Sandbox Code Playgroud)
不6-22:01:17意味着它已经运行了6天?我正在尝试确定进程运行了多长时间......
第二列是进程ID吗?所以如果我这样做kill 32017会杀死第二个进程?
Hyp*_*ppy 54
ps -ef | egrep "GMC|PID"
Run Code Online (Sandbox Code Playgroud)
ps根据需要更换“GMC”和开关。
示例输出:
root@xxxxx:~$ ps -ef | egrep "disk|PID"
UID PID PPID C STIME TTY TIME CMD
paremh1 12501 12466 0 18:31 pts/1 00:00:00 egrep disk|PID
root 14936 1 0 Apr26 ? 00:02:11 /usr/lib/udisks/udisks-daemon
root 14937 14936 0 Apr26 ? 00:00:03 udisks-daemon: not polling any devices
Run Code Online (Sandbox Code Playgroud)
Vic*_*Lau 24
感谢 geekosaur,我想用这个命令来满足你的需求,而不是一个单独的命令:
ps -ef | head -1; ps -ef | grep "your-pattern-goes-here"
Run Code Online (Sandbox Code Playgroud)
棘手的是使用“;” shell 支持链接命令。
第二列是进程ID;4th 是创建进程的时间(这通常是您的程序启动的时间,但并非总是如此;请考虑execve()和朋友们);第 6 个是消耗的 CPU 时间量。所以它已经运行了 8 天并使用了将近 7 天的 CPU 时间,我认为这令人担忧。
在同一个调用中获取标头充其量是棘手的;我只是做一个单独的ps | head -1. 您可能会考虑使用ps自己的选择方法或类似的方法pgrep代替grep,这并不是真正设计用于传递标题。
egrep 解决方案既简单又有用,但当然您依赖于始终包含“PID”的标头(尽管这是一个非常合理的假设)以及在其他地方不出现的相同字符串。我猜这足以满足您的需求,但是如果有人想要替代方案,则可以使用 sed。
Sed 让您只需说“打印第一行,然后打印包含该模式的任何行”。例如:
ps auxwww | sed -n '1p; /PROCESS_NAME_TO_SEARCH/p;'
Run Code Online (Sandbox Code Playgroud)
添加/sed -n/d;以过滤 sed 本身:
ps auxwww | sed -n '1p; /sed -n/d; /PROCESS_NAME_TO_SEARCH/p;'
Run Code Online (Sandbox Code Playgroud)
更简单的选择:
ps -ef | { head -1; grep GMC; }
用显示标题的行数替换数字。