按包名查找正在运行的进程ID

Muk*_*ani 17 android adb

我正在编写一个脚本,我需要提供我的应用程序的PID.我可以通过以下命令列出所有进程及其PID,并可以看到我的应用程序的条目.

adb shell ps

这给了我一个巨大的进程列表.我需要一个条目(我可以进一步提供给另一个命令),所以我想用包名过滤这个结果.grep命令在我的Windows机器上不起作用.也尝试了以下命令,但它没有帮助.

adb shell ps name:my_app_package

Ale*_* P. 24

从Android 7.0开始,按包名查找进程ID的最简单方法是使用pidof命令:

usage: pidof [-s] [-o omitpid[,omitpid...]] [NAME]...

Print the PIDs of all processes with the given names.

-s      single shot, only return one pid.
-o      omit PID(s)
Run Code Online (Sandbox Code Playgroud)

就像这样运行它:

adb shell pidof my.app.package
Run Code Online (Sandbox Code Playgroud)

在7.0之前的Android中,人们使用ps命令然后使用内置的按comm值过滤(对于Android应用程序是包名称的最后15个字符)或grep命令来解析其输出.comm如果名称的最后15个字符以数字开头,并且grep默认情况下未包含在Android 4.2中,则过滤器不起作用.但即使找到了正确的生产线,PID仍然需要提取该值.

有多种方法可以做到这一点.以下是使用单个sed命令查找进程和提取PID的方法:

adb shell "ps | sed -n 's/^[^ ]* *\([0-9]*\).* my\.app\.package$/\1/p'"
Run Code Online (Sandbox Code Playgroud)

问题是,sed在Android 6.0之前,默认情况下并未包含该问题.

但是,如果您必须使用较旧的设备,则可以始终使用以下Android版本独立解决方案.它不使用任何外部命令 - 只是Android shell内置命令:

adb shell "for p in /proc/[0-9]*; do [[ $(<$p/cmdline) = my.app.package ]] && echo ${p##*/}; done"
Run Code Online (Sandbox Code Playgroud)

寻找PID的最常见原因是在其他命令中使用它kill.假设我们有多个logcat运行实例,我们想要一次性优雅地完成它们.只需在最后一个命令中替换echowith kill -2:

adb shell "for p in /proc/[0-9]*; do [[ $(<$p/cmdline) = logcat ]] && kill -2 ${p##*/}; done"
Run Code Online (Sandbox Code Playgroud)

如果从Linux/OSX shell运行命令",'则替换为.


Dev*_*rim 11

而不是使用adb shell ps,首先输入adb shell然后使用ps.

一步步:

  1. adb shell连接设备(或仿真器)时输入命令.
    (命令行前缀将shell@android:/ $在执行此命令后执行.)

  2. 输入ps | grep <package_name_to_be_filtered>(即ps | grep com.google).


C:> adb shell
shell@android:/ $ ps | grep com.google
u0_a64  3353  2467  903744 52904 ffffffff 00000000 S com.google.process.location
u0_a64  3426  2467  893964 49452 ffffffff 00000000 S com.google.process.gapps
Run Code Online (Sandbox Code Playgroud)

  • 默认情况下,从“adb shell”中运行“ps”不会返回所有进程,只会返回用户有权查看的进程。使用其中一个开关(如“-A”)运行可以解决这个问题。(Nexus5X API 19) (2认同)

Hir*_*dya 1

ps 显示的进程可以限制为属于任何给定用户的进程,方法是通过 grep(一个用于搜索文本的过滤器)管道输出。例如,属于用户名为 adam 的用户的进程可以通过以下方式显示:

ps -ef | grep adam
Run Code Online (Sandbox Code Playgroud)

-e 选项生成有关当前运行的每个进程的信息列表。-f 选项生成的列表包含的每个进程的信息项少于 -l 选项。