我经常需要检查某个进程是否正在运行,因此我使用以下方法之一:
ps aux | grep myprocess
ps -Fe | grep myprocess
top
pgrep myprocess (only shows the PID)
pkill myprocess (if I want to kill it)
以上所有命令都运行良好,但是,是否有更短的命令来执行此操作?任何答案都值得赞赏,但所选答案必须是...
- 内置解决方案,因为我使用许多不同的设备。
- 允许使用模式。
- 提供与 ps aux 类似的信息。
- 比我们已经知道的要短。
谢谢
答案1
我认为您所要求的东西不存在,那么为什么不编写一个小型 bash 函数或脚本来执行您想要的操作呢?
function p {
ps aux | awk -v s="$@" 'NR>1 && $11~s'
}
将其粘贴到您的~/.bash_functions
(或任何被调用的地方~/.bashrc
)并调用source ~/.bashrc
以重新加载它,您应该能够运行:
$ p firefox
oli 5992 11.2 4.2 2856240 1044104 ? Sl Jun17 313:56 /usr/lib/firefox/firefox
该表达式将采用正则表达式,这使其更加方便。并且p
它本身会为您提供完整列表。
答案2
使用别名和 grep 过滤掉其自己的终端进程:
alias qp="ps aux | grep -E -v \"tty.*grep|pts.*grep\" | grep -m1"
如果您想要最后/最新的流程:
alias qp="ps ax | tac | grep -E -v \"tty.*grep|pts.*grep\" | grep -m1"
答案3
如果正在运行,则给出进程 ID,如果未运行,则不给出
pidof 进程
答案4
其他答案都很好,基本上将您的临时解决方案包装ps | grep
成 shell 别名或函数。这种方法没有错。但请注意,这意味着ps
将提取所有正在运行的进程的信息,然后您可以awk
过滤grep
掉感兴趣的行。
我建议使用pgrep
来获取 PID 列表(如您在问题中所显示的那样),并使用ps
来获取仅与 匹配的 PID 所需的输出格式,这样效率会稍微更高一些pgrep
。
简单的流程匹配,POSIX 风格满的清单
pg() {
pids=`pgrep -d, "$1"`
[ "$pids" ] && ps -f -p "$pids"
}
pg myprocess
这将显示匹配的进程名称的完整ps
列表。可以将此函数定义添加到~/.bashrc
始终在交互式 shell 中定义。还可以通过几种不同的方式对其进行修改,以更改输出格式或匹配完整命令行而不仅仅是进程名称。
简单的进程匹配,BSD 风格用户清单
pg() {
pids=`pgrep -d, "$1"`
[ "$pids" ] && ps up "$pids"
}
完整命令行匹配,BSD 风格作业控制清单
pg() {
pids=`pgrep -f -d, "$1"`
[ "$pids" ] && ps jp "$pids"
}
完整命令行匹配,POSIX 风格长的清单
pg() {
pids=`pgrep -f -d, "$1"`
[ "$pids" ] && ps -l -p "$pids"
}
请注意,最后两个示例中-f
的 on 选项pgrep
与完整命令行相匹配。您可以根据需要修改这些示例,其中最重要的部分是p
或-p
选项与 找到的 PID 列表一起给出pgrep
。