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

时间:2013-06-29 23:55:43

标签: linux bash grep nohup

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

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

ps -ef |grep nohup 

这是杀人的命令

 kill -9 1787 787

16 个答案:

答案 0 :(得分:292)

使用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

答案 1 :(得分:74)

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

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

ps -ef

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

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

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

kill PID 

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

就是这样!

我希望这个答案对于那些我也很擅长bash和SSH的人有用,但是我发现我需要95%的知识:)

答案 2 :(得分:36)

假设我在后台使用以下命令运行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

答案 3 :(得分:14)

jobs -l <​​/ strong>应该为你提供nohup进程列表的pid。 轻轻地杀死它们(-9)。 ;)

答案 4 :(得分:5)

你可以尝试

kill -9 `pgrep [command name]`

答案 5 :(得分:4)

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

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

答案 6 :(得分:3)

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

僵尸进程终于停止了。

答案 7 :(得分:1)

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

nohup manage.py runserver <localhost:port>

这适用于CentOS:

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

答案 8 :(得分:1)

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

答案 9 :(得分:1)

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

top -U 用户 ID

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

您将使用top获取PID,然后执行kill操作。

$ kill -9 <PID>

答案 10 :(得分:0)

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

nohup sh test.sh &

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

25013

您可以杀死它:

kill 25013

答案 11 :(得分:0)

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

  1. 使用ps -ef命令中显示的STIME。这显示了开始过程的时间,很有可能在关闭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终止进程。

答案 12 :(得分:0)

这在Mac上可以正常运行

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

答案 13 :(得分:0)

关于丢失putty:通常ps ... | awk/grep/perl/...流程也会被匹配!所以老派的招就是这样

ps -ef | grep -i [n]ohup 

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

答案 14 :(得分:0)

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

答案 15 :(得分:0)

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

ps aux | grep script_Name

此处,script_Name 可以是 nohup 运行的任何脚本/文件。 此命令为您提供进程 ID。然后使用下面的命令杀死在 nohup 上运行的脚本。

kill -9 1787 787

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