如何在脚本中获取进程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 PID
或kill -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.log
。 2 > &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 -ef
和 kill
都在上面被很好地覆盖了,那么新的部分是什么?
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】:关于丢失您的putty
:ps ... | awk/grep/perl/...
进程通常也会匹配!所以老派的把戏是这样的
ps -ef | grep -i [n]ohup
这样正则表达式搜索与正则表达式搜索过程不匹配!
【讨论】:
【参考方案16】:如果您在远程服务器上,请使用 top
检查内存使用情况,并找到您的进程及其 ID。之后,只需执行kill [your process ID]
。
【讨论】:
以上是关于如何在脚本中获取进程ID的主要内容,如果未能解决你的问题,请参考以下文章
如何在linux中使用shell脚本杀死进程时获取退出代码=0