先放一个脚本镇楼,有需要可以直接拿去用,chmod +x 加上执行权限就OK了,把查找进程改成自己的。
用的好用,有兴趣再来看看第二章节的ps指令的介绍
可以使用的shell脚本
#!/bin/bash
###
# @Author : Zry && 978524088@qq.com
# @Date : 2024-05-12 12:31:06
# @LastEditors : Zry && 978524088@qq.com
# @LastEditTime : 2024-07-08 11:11:08
# @FilePath : /zry/bin/show_op_info
# @Description :
#
# Copyright (c) 2024 by 978524088@qq.com, All Rights Reserved.
###
declare -A printed_pids # 关联数组,用于记录已打印过的进程ID
print_tree() {
local pid=$1
local indent="$2"
local last=$3
# 如果已经打印过该进程,则直接返回
if [[ ${printed_pids[$pid]} -eq 1 ]]; then
return
fi
((printed_pids[$pid]++)) # 标记该进程已被打印
# 检查当前进程是否存在
if ps -p $pid > /dev/null; then
# 获取当前进程的所有子进程PID
local children=($(pgrep -P $pid))
# 获取当前进程的详细信息
# local proc_info=$(ps -p $pid -o pid,tty,stat,cmd | tail -n 1 | head -n 2)
local proc_info=$(ps -p $pid -o pid,tty,stat,etimes,time,uid,euser,cmd | tail -n 1)
# 判断是否是第一个调用
local prefix=""
if [ -n "$indent" ]; then
if [ "$last" = "true" ]; then
prefix="└── "
else
prefix="├── "
fi
fi
# 显示当前进程
echo -e "$indent$prefix$proc_info"
# 如果有子进程,递归调用函数显示子进程
local last_child=true
for child in "${children[@]}"; do
if [[ -n $child ]]; then
if [ "$last_child" = "true" ]; then
print_tree $child "$indent " "true"
last_child=false
else
print_tree $child "$indent " "false"
fi
fi
done
fi
}
# 检查并显示各个进程的树状图信息 有变化只需要修改 in 后面的 查找进程名称
for process_name in OpUpDataMD OpWebMD OpConnectMD OpIsosSvrProgramMD OpIsosMD; do
pids=$(pgrep -f "$process_name")
if [ -n "$pids" ]; then
echo "进程 $process_name 的详细信息:"
echo -e "PID TTY STAT ETIME UID EUSER COMMAND"
for pid in $pids; do
print_tree $pid "" "true" # 打印根节点,标记为最后一个节点
done
echo
else
echo "进程 $process_name 没有运行。"
fi
done
Linux 下的 ps 命令使用介绍
简介
ps
是 Linux 系统中用来查看当前进程状态的工具。它提供了一种快速查看系统进程及其状态的方式,对于系统管理员和用户来说,是诊断问题和监控系统性能的重要工具。
基本语法
ps [options]
常用参数
-a
- 显示终端上的所有进程。
-u
- 以用户易读的格式显示进程信息。
-x
- 显示没有控制终端的进程。
-e
- 显示所有进程。
-o
- 指定显示哪些信息,可以与
ps
命令默认显示的信息一起使用,或者用来替换默认信息。 - 定义输出格式,后面跟列名,如
PID,USER,COMMAND
。
- 指定显示哪些信息,可以与
-p
- 指定进程ID的范围。
-f
- 全格式显示,类似于
ps -ef
。
- 全格式显示,类似于
参数使用实例
-a
参数使用实例
ps -a
这会列出当前终端的所有进程信息。
-u
参数使用实例
ps -u username
- 显示特定用户的进程
- 结合使用
-u
和-U
参数,可以显示特定用户的进程。 - 这个命令会显示指定用户
username
的所有进程,信息将以用户易读的格式显示。
-x
参数使用实例
ps -x
展示所有没有控制终端的进程。
-e
参数使用实例
ps -e
显示系统中的所有进程。使用参数e
可以显示系统上的所有进程,包括僵尸进程和守护进程。
-o
参数使用实例
ps -eo pid,cmd,%mem
展示所有进程的进程ID、命令名和内存使用百分比。
按用户排序进程
使用-eo
参数指定输出列,并使用sort
命令进行排序。
ps -eo pid,user,cmd --sort user
-p
参数使用实例
ps -p PID
显示进程ID为 PID
的进程信息。
显示特定进程的详细信息
使用-f
参数可以显示特定进程的完整信息。
ps -f pid
展示全格式的进程信息,相当于 ps -ef
。
查找名为特定字符串的进程
使用-C
参数指定进程名。
ps -C process_name
显示进程树
使用-f
参数结合-pgrep
可以显示进程树。
ps -ef | grep 'process_name'
使用ps
命令的输出作为其他命令的输入
可以将ps
的输出通过管道传递给其他命令。
ps -u username | grep 'process_name'
显示进程的详细信息并排序
结合使用-o
和--sort
参数,可以自定义显示列并进行排序。
ps -eo pid,user,etime,cmd --sort=-pid
在使用 ‘ps’ 命令时,如何排除某些特定的进程?
在使用ps
命令时,排除特定进程通常不是直接通过ps
命令的参数来实现的,因为ps
命令本身并没有提供直接排除特定进程的选项。但是,可以通过以下几种方法间接实现排除特定进程的目的:
使用
grep
命令排除:
使用ps
命令获取进程列表,然后通过管道将输出传递给grep
命令,并使用-v
参数来排除包含某些特定文本的行。ps aux | grep -v 'process_name'
这里
'process_name'
是你想要排除的进程名称。grep -v
命令会排除所有包含'process_name'
的行。使用
awk
命令排除:
awk
是一个强大的文本处理工具,可以用来排除特定的进程。ps aux | awk '!/pattern_to_exclude/'
在这个例子中,
'pattern_to_exclude'
是一个正则表达式,用来匹配你想要排除的进程。组合使用
grep
和grep -v
:
有时候,你可能需要排除多个特定的进程名称,可以结合使用grep
来获取想要的进程,然后使用grep -v
来排除不想要的进程。ps aux | grep 'desired_process' | grep -v 'excluded_process1' | grep -v 'excluded_process2'
使用
pgrep
和pkill
命令排除:
如果你知道要排除的进程的确切名称或PID,可以使用pgrep
来获取这些进程的PID,然后使用pkill
来杀死它们。pgrep -f 'excluded_process' | xargs pkill -P
这个命令会查找所有包含
'excluded_process'
的进程,并通过xargs
将它们的PID传递给pkill -P
来杀死它们。使用
ps
命令的输出作为其他命令的条件:
你可以使用ps
命令的输出作为其他命令的条件,通过逻辑判断来排除特定的进程。ps aux | while read line; do if ! echo "$line" | grep -q 'excluded_process'; then echo "$line" fi done
这个脚本会逐行读取
ps
的输出,如果某行不包含'excluded_process'
,则打印该行。
注:,排除进程的方法取决于你具体的需求和场景。上述方法提供了一些基本的思路,可以根据实际情况进行调整和组合使用。
如何快速找到特定进程的详细信息
- 使用
top
或htop
命令: 如果你想要实时监控特定进程的资源使用情况,可以使用top
或htop
命令,并使用进程名或PID过滤。
top -p PID`
或者在htop
中按F3
,然后输入进程名或PID进行过滤。
- 使用
pstree
命令查看进程树: 如果你想要查看特定进程及其子进程的树状结构,可以使用pstree
。
pstree -p PID
分享一个有趣的 学习链接