已知进程ID,如何获取进程名称 以及路径。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了已知进程ID,如何获取进程名称 以及路径。相关的知识,希望对你有一定的参考价值。

用VB实现,给出源代码。分数立马送上。在线等。

参考技术A 在“开始”—“运行”栏中输入“wmic”,然后点“确定”,此时XP就会弹出一个名为“C:\WINDOWS\System32\Wbem\wmic.exe”的命令行黑窗口(如果大家是第一次运行的话,窗口中会先显示“正在安装WMIC,请稍候。”),它的提示符是“wmic:root\cli>”,我们在其后输入“Process”命令(“进程”的意思)并回车,就会看到进程与其所对应的路径了 参考技术B VB 获取指定进程ID的 完整文件名,路径名

Private Type PROCESSENTRY32
dwSize As Long
cntUsage As Long
th32ProcessID As Long
th32DefaultHeapID As Long
th32ModuleID As Long
cntThreads As Long
th32ParentProcessID As Long
pcPriClassBase As Long
dwFlags As Long
szExeFile As String * 1024
End Type
Const TH32CS_SNAPHEAPLIST = &H1
Const TH32CS_SNAPPROCESS = &H2
Const TH32CS_SNAPTHREAD = &H4
Const TH32CS_SNAPMODULE = &H8
Const TH32CS_SNAPALL = (TH32CS_SNAPHEAPLIST Or TH32CS_SNAPPROCESS Or TH32CS_SNAPTHREAD Or TH32CS_SNAPMODULE)
Const TH32CS_INHERIT = &H80000000
Private Declare Function CreateToolhelp32Snapshot Lib "kernel32" (ByVal dwFlags As Long, ByVal th32ProcessID As Long) As Long
Private Declare Function Process32First Lib "kernel32" (ByVal hSnapshot As Long, lppe As PROCESSENTRY32) As Long
Private Declare Function Process32Next Lib "kernel32" (ByVal hSnapshot As Long, lppe As PROCESSENTRY32) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function TerminateProcess Lib "kernel32" (ByVal hProcess As Long, ByVal uExitCode As Long) As Long

Sub GetProcessName(ByVal processID As Long, szExeName As String, szPathName As String)
Dim my As PROCESSENTRY32
Dim hProcessHandle As Long
Dim success As Long
Dim l As Long

l = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)
If l Then
my.dwSize = 1060
If (Process32First(l, my)) Then
Do
If my.th32ProcessID = processID Then
CloseHandle l
szExeName = Left$(my.szExeFile, InStr(1, my.szExeFile, Chr$(0)) - 1)
For l = Len(szExeName) To 1 Step -1
If Mid$(szExeName, l, 1) = "\" Then Exit For
Next l
szPathName = Left$(szExeName, l)
Exit Sub
End If
Loop Until (Process32Next(l, my) < 1)
End If
CloseHandle l
End If

End Sub

调用

GetProcessName processID, szExeName, szPathName

processID 进程ID
szExeName 返回的完整文件名,没找到 返回 ""
szPathName 返回的完整路径名,以"\" 结束,没找到 返回 ""本回答被提问者采纳

如何在给定进程名称的情况下获取 pid

【中文标题】如何在给定进程名称的情况下获取 pid【英文标题】:How to get pid given the process name 【发布时间】:2013-09-16 21:37:08 【问题描述】:

您好,我搜索了各种论坛,也在这里,我可以找到一些适用于 Linux 和 Mac 的答案,但找不到适用于 Unix 尤其是 Korn Shell 的解决方案。

如何从进程id(pid)中获取进程名(命令名)

下面是我从 SO 中找到的参考资料 This one And this one also

我试过下面的命令

ps -eaf | awk ' print substr($0, index($0, $9)) '

上面的命令在给出 TIME 而不是 Month 和 Date 的地方失败(因为在这种情况下,字符串中只有 8 列)

任何建议都会有所帮助。

【问题讨论】:

不,我想要进程名称中的 pid,标题输入错误 这个问题与您的 unix 版本非常相关,与 shell 几乎没有关系。请包含uname -a的输出。 对于碰巧发现此问题的 Mac 用户,另请参阅 ***.com/questions/11546765/…。 【参考方案1】:

您可以使用pidof获取名称为p_name的正在运行进程的所有ID:

pidof p_name | tr ' ' '\n'(用于垂直列表)

pkill p_name - 杀死名称为p_name的所有进程

确保您有权将他们全部杀死:)

【讨论】:

pidof 适用于超过 15 个字符的进程名称【参考方案2】:
ps -C <the-name> -o etime=

我的 ps 来自 procps-ng。

【讨论】:

我也使用ps -C &lt;process-name&gt; -o user= | head -1来获取进程所有者(用户)【参考方案3】:

我觉得用pgrep比较方便

$ pgrep bluetoothd
441

否则你可以使用awk:

ps -ef | awk '$8=="name_of_process" print $2'

例如,如果ps -ef有这样一行:

root       441     1  0 10:02 ?        00:00:00 /usr/sbin/bluetoothd

然后ps -ef | awk '$8=="/usr/sbin/bluetoothd" print $2' 返回441


在 ksh 中找不到 pgrep。另一个解决方案失败,以防万一 以下是 ps 命令 jaggsmca325 7550 4752 0 Sep 11 pts/44 的输出 0:00 sqlplus dummy_user/dummy_password@dummy_schema

让我们检查最后一列 ($NF),不管它的编号是多少:

$ ps -ef | awk '$NF=="/usr/sbin/bluetoothd" print $2'
441

如果你想匹配不精确的字符串,你可以使用~来代替:

$ ps -ef | awk '$NF~"bluetooth" print $2'
441
1906

【讨论】:

在 ksh 中找不到 pgrep。如果下面是 ps 命令jaggsmca325 7550 4752 0 Sep 11 pts/44 0:00 sqlplus dummy_user/dummy_password@dummy_schema 的输出,则另一个解决方案将失败 我尝试了您的解决方案,它非常有效,但在进程名称具有如下空格的情况下失败了 ps -eaf | awk '$NF=="sshd: jaggsmca325@pts/53" print $2' 任何指向该问题的指针?是的,我想获得匹配的确切进程名称。 @gahlot.jaggs 我用$NF,你也可以用$(NF-1)等,所以你可以用$(NF-1)=="sshd:" &amp;&amp; $NF=="jaggsmca325@pts/53" 感谢您的所有努力,但我不知道在运行时我会有多少令牌,所以我不能使用 $(NF-1) 否则它将被固定为 N-仅 1 并且在其他情况下将失败。有什么方法可以通过使用进程名称而不是使用 ps -eaf 来找到进程 ID @gahlot.jaggs 您也可以grep "process$",因为$ 表示行尾。然后将字符串提供给 awk 以打印第二条记录。【参考方案4】:

如果您的 ps | awk 解决方案失败,因为 ps 的输出不是您想要的,那么就这样吧:

ps -eaf -o pid,cmd | awk '/regex-to-match-command-name/ print $1 '

【讨论】:

上面写着 ps: 非法选项 -- o ps 因您的平台而异(但我认为-o 是标准的)。检查您的文档以了解如何操作输出字段。 (man ps) ps 还支持o(不带-)和--format,具体取决于您的平台。

以上是关于已知进程ID,如何获取进程名称 以及路径。的主要内容,如果未能解决你的问题,请参考以下文章

如何在linux中指定进程名称时仅获取进程ID?

delphi 知道路径和进程如何获取窗口句柄?

如何使用脚本通过其服务名称获取进程ID到变量

C#如何通过进程名称获取指定窗口的句柄,通过该句柄获取该窗口的标题?

如何在python中获取名称的进程ID

linux获取进程id和进程名称