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


204

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

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

ps -ef |grep nohup 

这是杀死的命令

 kill -9 1787 787

6
您是要从脚本还是在命令行中杀死它?您要么需要在执行操作时保存PID,nohup然后将其用于kill,要么通过其命令名称在ps -ef输出中找到进程并从中获取PID。您必须寻找命令名称,而不是nohup
潜伏者,

1
@mbratch您应该将其作为答案而不是评论。
Ansgar Wiechers 2013年

@AnsgarWiechers感谢您的建议。有时候,如果我的回答很简短,或者不确定是否完全涵盖了OP的要求,我会犹豫将其发布为答案。我添加了一个答案,并提供了更多信息。
潜伏者2013年

Answers:


353

使用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外壳程序知道它是该上下文中的文件描述符,而不只是一个名为的文件1。在2>&1需要捕捉任何错误消息通常被写入标准错误到我们的my.log文件(从标准输出来)。有关使用shell处理I / O重定向的更多详细信息,请参见I / O重定向

如果该命令定期发送输出,则可以偶尔使用来检查输出tail my.log,或者如果要“实时”跟踪输出,可以使用tail -f my.log。最后,如果您需要终止该过程,可以通过以下方法完成:

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

15
稍微说明一下,它nohup本身并不是打印PID,而是最终&显示背景ls &的PID ,例如显示正在运行的PIDls
karmakaze

1
'2>&1'是做什么的?
维拉伊

4
@Viraj 2是“标准错误”文件描述符。>是shell重定向,并且&1是“标准输出”文件描述符(&此处需要此文件描述符,因此shell不会认为我指的是名为的文件1)。因此,2 > &1将任何标准错误输出重定向到标准输入。由于先前的> my.log方法将标准输出重定向到my.log,因此我们需要一种方法来确保也将错误消息发送到my.log2 > &1确保此类错误进入标准输出,而标准输出依次为my.log。请参阅I / O重定向
潜伏者,2016年

6
echo $!给了我nohup的能力,而不是产生的过程:paste.fedoraproject.org/428697/99695314
Nehal J Wani

1
@Mvorisek &充当命令分隔符,因此您可以尝试sh -c "nohup my_command > my.log 2>&1 & echo $! > save_pid.txt"。它可能有效,但是我还没有尝试过。
潜行者

91

我在VPS服务器上(以及通过SSH-油灰)使用Red Hat Linux,对我来说,以下工作有效:

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

ps -ef

然后在第一列中找到您的用户名;我发现了以下三遍:

  • 其中之一是SSH连接
  • 第二个是FTP连接
  • 最后一个是nohup过程

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

kill PID 

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

就是这样!

我希望这个答案对我也是bash和SSH的新手有用,但是在这里找到了我所需要的95%的知识:)


3
我认为您是在这里使用PID而不是UID?
wprins

我同意@wprins。杀死UID对我不起作用,但杀死PID却可以。
Ryan

就我而言,我运行了一个带有nohup和&的测试shell脚本(long_running_script.sh),并且dint知道如何停止它。最后,我做了一个ps -ef | grep long_running *并找到PID。然后做了一个杀害PID
Rennish Joseph

50

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

nohup ruby script.rb &

然后我可以通过指定命令名称来获得上述后台进程的pid。就我而言,命令是红宝石。

ps -ef | grep ruby

输出

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

现在您可以使用kill命令轻松地终止进程

kill 25938

1
Sanjay,请确保我不会丢失任何内容,您答案的哪一部分是新的或与多年前提供的答案不同?ps -ef并且kill在上面都有很好的介绍,那么新的部分是什么?
David C. Rankin

2
ps -ef将为您提供一长串输出,并且很难从此长串中进行搜索。所以我认为ps -ef | grep ruby​​比执行ps -ef更好的命令是搜索pid
Sanjay Salunkhe 2015年

20

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


11
仅当作业在当前shell中启动时。也不要kill -9,除非你知道定期信号不起作用。
Tripleee '16

1
如果您在未安装ps的某些docker映像上,这将非常有用:-)
Andreas Profous

5

你可以试试

kill -9 `pgrep [command name]`

2
非常好!我曾经用过pkill [command name]您可以使用该-o标志杀死最旧的匹配过程,或者-n使用最新的标志。
zanona

4

这适用于 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

僵尸进程终于停止了。


4

假设您正在使用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}

2

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

nohup sh test.sh &

输出将为您显示进程ID,例如

25013

你可以杀死它:

kill 25013

1

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

nohup manage.py runserver <localhost:port>

这适用于CentOS:

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

这是解决process not foundnohup混乱的方法。
CodeSpent

0

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

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

一旦找到了该过程的PID,则可以kill pid用来终止该过程。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.