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

use*_*056 189 linux bash grep nohup

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

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

ps -ef |grep nohup 
Run Code Online (Sandbox Code Playgroud)

这是杀人的命令

 kill -9 1787 787
Run Code Online (Sandbox Code Playgroud)

lur*_*ker 319

使用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
Run Code Online (Sandbox Code Playgroud)

这将运行my_command将所有输出保存到my.log(在脚本中,$!表示执行的最后一个进程的PID).它2是标准error(stderr)的文件描述符,并2>&1告诉shell将标准错误输出路由到标准输出(文件描述符1).它要求&1shell知道它是该上下文中的文件描述符而不仅仅是一个名为的文件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
Run Code Online (Sandbox Code Playgroud)

  • 稍微澄清一下,打印PID本身并不是"nohup",它是最终的`&`,它背景,例如`ls&`将显示运行`ls的PID' (12认同)
  • `echo $!`给了我nohup的pid而不是生成的进程:https://paste.fedoraproject.org/428697/99695314/ (4认同)
  • @Viraj`2`是"标准错误"文件描述符.`>`是shell重定向,`&1`是"标准输出"文件描述符(这里需要`&`,所以shell不会认为我指的是一个名为`1`的文件).所以`2>&1`将任何标准错误输出重定向到标准输入.由于先前的`> my.log`意味着将标准输出重定向到`my.log`,我们需要一种方法来确保错误消息也转到`my.log`.`2>&1`确保这些错误转到标准输出,而标准输出又转到`my.log`.请参阅[I/O重定向](http://www.tldp.org/LDP/abs/html/io-redirection.html). (3认同)

Pho*_*box 85

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

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

ps -ef
Run Code Online (Sandbox Code Playgroud)

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

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

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

kill PID 
Run Code Online (Sandbox Code Playgroud)

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

就是这样!

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

  • 我觉得你的意思是PID而不是UID吗? (3认同)

San*_*khe 41

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

nohup ruby script.rb &
Run Code Online (Sandbox Code Playgroud)

然后我可以通过指定命令名来获得上述后台进程的pid.在我的情况下命令是ruby.

ps -ef | grep ruby
Run Code Online (Sandbox Code Playgroud)

产量

ubuntu   25938 25742  0 05:16 pts/0    00:00:00 ruby test.rb
Run Code Online (Sandbox Code Playgroud)

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

kill 25938
Run Code Online (Sandbox Code Playgroud)

  • Sanjay,我确信我没有遗漏任何内容,您的答案的哪一部分是新的或与几年前提供的答案不同?上面已经很好地介绍了“ps -ef”和“kill”,那么新部分是什么? (2认同)
  • ps -ef会给你很长的输出列表,从这个长列表中搜索会很困难.所以我认为ps -ef | grep ruby​​是搜索pid的更好命令,而不仅仅是ps -ef (2认同)

Pun*_*han 17

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

  • 仅当作业在当前shell中启动时.除非你知道常规信号不起作用,否则不要"杀死-9". (11认同)

NuO*_*One 7

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

`ps aux | grep java`
Run Code Online (Sandbox Code Playgroud)

输出

xxxxx     9643  0.0  0.0  14232   968 pts/2   
Run Code Online (Sandbox Code Playgroud)

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

sudo kill 9643
Run Code Online (Sandbox Code Playgroud)

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

sudo killall java
Run Code Online (Sandbox Code Playgroud)

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

sudo killall {processName}
Run Code Online (Sandbox Code Playgroud)


小智 5

你可以试试

kill -9 `pgrep [command name]`
Run Code Online (Sandbox Code Playgroud)

  • 非常好!我使用`pkill [命令名]`你可以使用`-o`标志来杀死最老的匹配进程,或者`-n`来使用最新的匹配进程. (2认同)

Joh*_*Joe 5

这适用于Ubuntu

输入此内容以查找PID

ps aux | grep java
Run Code Online (Sandbox Code Playgroud)

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

就我而言是

johnjoe      3315  9.1  4.0 1465240 335728 ?      Sl   09:42   3:19 java -jar batch.jar
Run Code Online (Sandbox Code Playgroud)

现在杀掉它kill -9 3315

僵尸进程终于停止了。


Ana*_*iva 5

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

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