如何在脚本中获取进程ID

Posted

tags:

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

用法:开个cmd.exe窗口,输入:ntsd -c q -p PID
把最后那个PID,改成你要终止的进程的ID。如果你不知道进程的ID,任务管理器->进程选项卡->查看->选择列->勾上"PID(进程标识符)",然后就能看见了。
答2:xp下还有两个好东东tasklist和tskill。tasklist能列出所有的进程,和相应的信息。tskill能查杀进程,语法很简单:tskill 程序名!!

比如杀死进程 QQ

taskkill /f /fi "IMAGENAME eq QQ.exe"

1、用taskill命令
①taskkill /im
进程名称
示例:用taskkill /im
VStart.exe命令关闭音速启动,VStart.exe就是音速启动的进程名称,下面看操作,执行了三次,成功关闭了音速启动,再看下面的方法.
②taskkill /pid[进程码]
-t(结束该进程)
-f(强制结束该进程以及所有子进程)
注:有两种方法查进程的PID码:
①在命令行下用 tasklist 命令查出进程的PID号码,就是这些
参考技术A Theron Welch和Stefan Krueger写过一个ShutDownRunningApp的接口,你可以改造一下再应用。至于链接吗,百度知道一般审核是不过的,你也知道的。

如何获取进程 ID 以杀死 nohup 进程?

【中文标题】如何获取进程 ID 以杀死 nohup 进程?【英文标题】:How to get the process ID to kill a nohup process? 【发布时间】:2013-06-27 11:19:17 【问题描述】:

我正在服务器上运行一个 nohup 进程。当我试图杀死它时,我的腻子控制台会关闭。

这是我尝试查找进程 ID 的方式:

ps -ef |grep nohup 

这是杀死的命令

 kill -9 1787 787

【问题讨论】:

你是想从脚本中还是在命令行中杀死它?您要么需要在执行 nohup 时保存 PID,稍后将其用于 kill,要么在 ps -ef 输出中通过其命令名称查找进程并从中获取 PID。您必须查找命令名称,而不是 nohup @mbratch 您应该将其作为答案而不是评论。 @AnsgarWiechers 感谢您的建议。有时,如果我的回答非常简短,或者如果我不确定它是否完全涵盖了 OP 的要求,我会犹豫是否将其发布为答案。我添加了一个答案并包含了更多信息。 【参考方案1】:

当使用nohup 并将任务置于后台时,后台操作员 (&) 将在命令提示符处为您提供 PID。如果您的计划是手动管理进程,您可以保存该 PID 并在需要时通过kill PIDkill -9 PID (如果您需要强制终止)使用它来终止进程。或者,您可以稍后通过ps -ef | grep "command name" 找到 PID,然后从那里找到 PID。请注意,nohup 关键字/命令本身不会出现在相关命令的ps 输出中。

如果你使用脚本,你可以在脚本中做这样的事情:

nohup my_command > my.log 2>&1 &
echo $! > save_pid.txt

这将运行my_command,将所有输出保存到my.log(在脚本中,$! 表示最后执行的进程的PID)。 2 是标准错误的文件描述符(stderr),2>&1 告诉 shell 将标准错误输出路由到标准输出(文件描述符 1)。它需要&1,以便shell 知道它是该上下文中的文件描述符,而不仅仅是一个名为1 的文件。需要2>&1 来捕获通常写入标准错误的任何错误消息到我们的my.log 文件(来自标准输出)中。有关使用 shell 处理 I/O 重定向的更多详细信息,请参阅I/O Redirection。

如果命令定期发送输出,您可以使用tail my.log 偶尔检查输出,或者如果您想“实时”关注它,您可以使用tail -f my.log。最后,如果你需要终止进程,你可以通过:

kill -9 `cat save_pid.txt`
rm save_pid.txt

【讨论】:

稍微澄清一下,打印 PID 的不是 nohup 本身,而是作为背景的最后一个 &,例如ls & 将显示运行 ls 的 PID '2>&1' 有什么作用? @Viraj 2 是“标准错误”文件描述符。 > 是 shell 重定向,&1 是“标准输出”文件描述符(此处需要 &,因此 shell 不会认为我指的是名为 1 的文件)。所以2 > &1 将任何标准错误输出重定向到标准输入。由于前面的> my.log 意味着将标准输出重定向到my.log,我们需要一种方法来确保错误消息也转到my.log2 > &1 确保此类错误转到标准输出,然后转到 my.log。见I/O Redirection。 echo $! 给了我 nohup 的 pid,而不是产生的进程:paste.fedoraproject.org/428697/99695314 @Mvorisek & 充当命令分隔符,因此您可以尝试 sh -c "nohup my_command > my.log 2>&1 & echo $! > save_pid.txt"。它可能有效,但我还没有尝试过。【参考方案2】:

我在 VPS 服务器上使用 red hat linux(并通过 SSH - putty),对我来说,以下工作:

首先,列出所有正在运行的进程:

ps -ef

然后在第一列中找到您的用户名;我找到了以下 3 次:

一个是 SSH 连接 第二个是 FTP 连接 最后一个是 nohup 进程

然后在第二列你可以找到nohup进程的PID,你只需要输入:

kill PID 

(当然是用nohup进程的PID替换PID)

就是这样!

我希望这个答案对我对 bash 和 SSH 也很陌生的人有用,但在这里找到了我需要的 95% 的知识 :)

【讨论】:

我想你的意思是 PID 而不是 UID? 我同意@wprins。杀死 UID 对我不起作用,但杀死 PID 对我有用。 就我而言,我使用 nohup 和 & 运行了一个测试 shell 脚本(long_running_script.sh),并且知道如何停止它。最后,我做了一个 ps -ef | grep long_running* 并找到 PID。然后做了一个kill PID【参考方案3】:

假设我使用以下命令在后台运行 ruby​​ 脚本

nohup ruby script.rb &

然后我可以通过指定命令名称来获取上述后台进程的pid。在我的例子中,命令是 ruby​​。

ps -ef | grep ruby

输出

ubuntu   25938 25742  0 05:16 pts/0    00:00:00 ruby test.rb

现在您可以使用 kill 命令轻松杀死进程

kill 25938

【讨论】:

Sanjay,我确定我没有遗漏任何内容,您的答案的哪一部分是新的或与多年前提供的答案不同? ps -efkill 都在上面被很好地覆盖了,那么新的部分是什么? ps -ef 会给你一长串输出,从这个长长的列表中搜索会很困难。所以我认为 ps -ef | grep ruby​​ 是搜索 pid 的更好命令,而不是仅仅执行 ps -ef 这个答案对我很有帮助,谢谢!【参考方案4】:

jobs -l 应该为您提供 nohup 进程列表的 pid。 轻轻地杀死(-9)他们。 ;)

【讨论】:

仅当作业在当前 shell 中启动时。不要kill -9,除非您知道常规信号不起作用。 这很有用,如果你在一些没有安装 ps 的 docker 镜像上:-)【参考方案5】:

你可以试试

kill -9 `pgrep [command name]`

【讨论】:

非常好!我使用了pkill [command name],您可以使用-o 标志来杀死最旧的匹配进程,或者-n 使用最新的。【参考方案6】:

假设你正在使用 nohup 执行一个 java 程序,你可以通过以下方式获取 java 进程 ID

`ps aux | grep java`

输出

xxxxx     9643  0.0  0.0  14232   968 pts/2   

然后你可以通过键入来终止进程

sudo kill 9643

或者说你需要杀死所有的java进程然后使用

sudo killall java

这个命令会杀死所有的 java 进程。您可以将其与流程一起使用。只需在命令末尾给出进程名称

sudo killall processName

【讨论】:

【参考方案7】:

如果您的应用程序总是使用相同的端口,您可以像这样终止该端口中的所有进程。

kill -9 $(lsof -t -i:8080)

【讨论】:

【参考方案8】:

这适用于Ubuntu

输入这个以找出PID

ps aux | grep java

所有关于java的运行过程都会显示出来

在我的情况下是

johnjoe      3315  9.1  4.0 1465240 335728 ?      Sl   09:42   3:19 java -jar batch.jar

现在杀了它kill -9 3315

僵尸进程终于停止了。

【讨论】:

【参考方案9】:

当您在 nohup 中创建作业时,它会告诉您进程 ID!

nohup sh test.sh &

输出将显示进程 ID,如

25013

你可以杀了它:

kill 25013

【讨论】:

【参考方案10】:

我使用以下命令启动了 django 服务器。

nohup manage.py runserver <localhost:port>

这适用于 CentOS:

:~ ns$netstat -ntlp
:~ ns$kill -9 PID 

【讨论】:

这是解决 process not found 与 nohup 混淆的方法。【参考方案11】:

我经常这样做。试试这个方法:

ps aux | grep script_Name

这里,script_Name 可以是 nohup 运行的任何脚本/文件。 此命令为您获取一个进程 ID。然后使用下面的这个命令杀死在 nohup 上运行的脚本。

kill -9 1787 787

这里,1787 和 787 是问题中提到的进程 ID 作为示例。 这应该符合问题的意图。

【讨论】:

【参考方案12】:

如果你不知道PID,那么首先使用TOP命令找到它

top -U 用户 ID

PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND

你会使用top获取PID,然后执行kill操作。

$ kill -9 <PID>

【讨论】:

【参考方案13】:

今天我遇到了同样的问题。而且因为是很久以前的事了,我完全忘记了我使用的是哪个命令以及何时使用的。我尝试了三种方法:

    使用ps -ef 命令中显示的时间。这显示了您开始进程的时间,并且很可能在您关闭 ssh(取决于您) 之前执行命令。不幸的是,我认为最新的命令不是我使用 nohup 运行的命令,所以这对我不起作用。 其次是 PPID,也显示在ps -ef 命令中。表示父进程ID,即创建进程的进程ID。对于使用 nohup 运行的进程,在 ubuntu 中 ppid 为 1。然后您可以使用ps --ppid "1" 获取列表,并检查 TIME(您的进程使用的总 CPU 时间)或 CMD 以查找进程的 PID。 如果进程占用一些端口,使用lsof -i:port,你会得到命令。然后就像上面的答案一样,使用ps -ef | grep command,您将获得PID。

找到进程的PID后,就可以使用kill pid终止进程了。

【讨论】:

【参考方案14】:

这适用于mac上的mi很好

kill -9 `ps -ef | awk '/nohup/ print \$2 '`

【讨论】:

【参考方案15】:

关于丢失您的puttyps ... | awk/grep/perl/... 进程通常也会匹配!所以老派的把戏是这样的

ps -ef | grep -i [n]ohup 

这样正则表达式搜索与正则表达式搜索过程不匹配!

【讨论】:

【参考方案16】:

如果您在远程服务器上,请使用 top 检查内存使用情况,并找到您的进程及其 ID。之后,只需执行kill [your process ID]

【讨论】:

以上是关于如何在脚本中获取进程ID的主要内容,如果未能解决你的问题,请参考以下文章

如何获取后台进程的进程ID?

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

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

如何在linux中使用shell脚本杀死进程时获取退出代码=0

linux在shell脚本中获取进程ID,父进程ID和用户ID的方法

Java如何得到当前进程ID号