查进程 PID
要查进程 PID,首先要知道一个 shell 命令——ps
。通过 ps 命令,我们可以查到任何想要的进程的 PID,然后就能通过 PID 对它干坏事了。
这里的 ps 命令是 适用 ADB 的,与传统 Linux 下的 PS 命令不完全一致。adb shell
下 ps 命令的用法如下:
ps [-AadefLlnwZ] [-gG GROUP,] [-k FIELD,] [-o FIELD,] [-p PID,] [-t TTY,] [-uU USER,]
先看一下这些参数的说明:
Which processes to show (selections may be comma separated lists):
-A All processes
// 显示所有进程(同 -e)
-a Processes with terminals that aren't session leaders
// 显示一个终端的所有进程,除了会话引线
-d All processes that aren't session leaders
// 显示所有进程,但省略所有的会话引线
-e Same as -A
// 与 -A 相同
-g Belonging to GROUPs
//gid or groupname 显示特定组的所有进程
-G Belonging to real GROUPs (before sgid)
-p PIDs (--pid)
// -p PID, 查看特定PID的进程状态信息
-P Parent PIDs (--ppid)
// -P PID, 查看特定PPID的进程状态信息
-s In session IDs
-t Attached to selected TTYs
-T Show threads
// 显示线程信息
-u Owned by USERs
// -u user, 显示user用户的进程信息
-U Owned by real USERs (before suid)
Output modifiers:
-k Sort FIELDs in +increasing or -decreasting order (--sort)
// -k +PID, 以PID增序排序显示
-M Measure field widths (expanding as necessary)
// 让输出的表格化信息自动适应列宽
-n Show numeric USER and GROUP
// 以数字形式显示USER和GROUP信息
-w Wide output (don't truncate fields)
// 宽输出(不截断字段)
Which FIELDs to show. (Default = -o PID,TTY,TIME,CMD)
-f Full listing (-o USER:12=UID,PID,PPID,C,STIME,TTY,TIME,ARGS=CMD)
// 显示括号中的列
-l Long listing (-o F,S,UID,PID,PPID,C,PRI,NI,ADDR,SZ,WCHAN,TTY,TIME,CMD)
// 显示括号中的列
-o Output FIELDs instead of defaults, each with optional :size and =title
// 显示指定列,多个列名之间用逗号隔开(参考上面的)
-O Add FIELDS to defaults
// 将指定列添加到默认列表(上面的 Default)
-Z Include LABEL
// 显示 LABEL
上面列出了大量的参数,但实际使用的时候,很少需要同时出现这么参数,往往最简单的就可以了。不过在使用过程中要注意以下事项:
1、如果已经进入adb shell
环境,则可以直接使用 ps 命令:
C:\Users\ShawnXia>adb shell
em_ts701_archos:/ # ps
USER PID PPID VSZ RSS WCHAN ADDR S NAME
root 15574 281 9092 3012 sigsuspend 76edcf4774 S sh
root 15582 15574 10676 3428 0 7b228f50d4 R ps
默认这里只列出了两条记录,如果要列出所有进程信息,带上参数-A
即可。
2、如果没有进入adb shell
环境,则可以直接使用adb shell ps
,此时不需要带任何参数,即可列出所有进程信息。
C:\Users\ShawnXia>adb shell ps
USER PID PPID VSZ RSS WCHAN ADDR S NAME
root 1 0 22848 3440 SyS_epoll_wait 4ff64c S init
root 2 0 0 0 kthreadd 0 S [kthreadd]
root 3 2 0 0 smpboot_thread_fn 0 S [ksoftirqd/0]
root 5 2 0 0 worker_thread 0 S [kworker/0:0H]
root 7 2 0 0 rcu_gp_kthread 0 S [rcu_preempt]
root 8 2 0 0 rcu_gp_kthread 0 S [rcu_sched]
……此处省略大量信息……
杀进程
通过 ps 命令查到进程 PID 后,我们就可以使用kill
命令对这个进程进行操作了。
adb shell
中的 kill 命令的用法如下:
usage: kill [-s signame | -signum | -signame] { job | pid | pgrp } ...
kill -l [exit_status ...]
这里杀进程只需要kill PID
即可,举个栗子:
// 不在adb shell环境中
C:\Users\ShawnXia>adb shell kill 28456
// 在adb shell中
C:\Users\ShawnXia>adb shell
em_ts701_archos:/ # kill 32268
小结
上面说了那么多,实际常用的就两组:
没有进adb shell
:
C:\Users\ShawnXia>adb shell ps
C:\Users\ShawnXia>adb shell kill 28456
进了adb shell
:
C:\Users\ShawnXia>adb shell
em_ts701_archos:/ # ps -A
em_ts701_archos:/ # kill 28456
其它方法
上面的方法是通用方法,但如果要干掉的不是那些系统服务,而是知道包名的其他进程,那还可以用下面的方法。
1、adb shell
下:
em_ts701_archos:/ # ps -A | grep com.android.email
u0_a48 1637 405 3519476 77516 SyS_epoll_wait 7d991385ac S com.android.email
em_ts701_archos:/ #
em_ts701_archos:/ # am force-stop com.android.email
# 或者
em_ts701_archos:/ # kill 1637
2、未进入adb shell
:
若未进入 adb shell,那在 cmd 环境下 grep 命令是用不了的:
C:\Users\ShawnXia>adb shell ps | grep com.android.email
'grep' 不是内部或外部命令,也不是可运行的程序
或批处理文件。
此时可以将 ps 和 grep 命令用双引号包起来,当做一个整体给到 adb shell 去处理:
C:\Users\ShawnXia>adb shell "ps | grep com.android.email"
u0_a48 9719 405 3571040 126896 SyS_epoll_wait 7d991385ac S com.android.email
C:\Users\ShawnXia>
C:\Users\ShawnXia>adb shell "am force-stop com.android.email"
// 或者
C:\Users\ShawnXia>adb shell kill 9719
本笔记已同步推送到微信公众号:灰灰的Rom笔记。