shell脚本获取Linux上的进程ID

我想编写一个shell脚本.sh文件)来获取给定的进程ID。 我在这里想要做的是一旦我得到进程ID,我想杀死这个进程。 我在Ubuntu(Linux)上运行。

我可以用类似的命令来做到这一点

 ps -aux|grep ruby kill -9 <pid> 

但我不知道如何通过shell脚本来做到这一点。

Solutions Collecting From Web of "shell脚本获取Linux上的进程ID"

ps的结果使用grep在脚本中是一个坏主意,因为它的一部分时间也会匹配你刚才调用的grep进程。 命令pgrep避免了这个问题,所以如果你需要知道进程ID,这是一个更好的选择。 (注意,当然可能会有很多进程匹配。)

然而,在你的例子中,你可以使用类似的命令pkill来杀死所有匹配的进程:

 pkill ruby 

顺便说一句,你应该知道,在几乎所有情况下使用-9都是过度的(ho ho) – 在“无用的kill -9表单信”中有一些有用的建议:

不不不。 不要使用kill -9

它并没有给这个过程一个干净的机会:

  1. 关闭套接字连接
  2. 清理临时文件
  3. 通知它的孩子,它正在消失
  4. 重置其终端特性

依此类推等等。

一般来说,发送15,等一两秒钟,如果不行的话,发送2,如果不行的话,发送1.如果不行,请删除二进制文件,因为程序表现不好!

不要使用kill -9 。 不要拿出联合收割机来收拾花盆。

如果你打算使用psgrep那么你应该这样做:

 ps aux|grep r[u]by 

这些方括号将导致grep跳过grep命令本身的行。 所以要在脚本中使用这个:

 output=`ps aux|grep r\[u\]by` set -- $output pid=$2 kill $pid sleep 2 kill -9 $pid >/dev/null 2>&1 

反引号允许你捕获shell命令的输出。 set --将ps输出解析为单词,$ 2是行中恰好是pid的第二个单词。 然后你发送一个TERM信号,等待几秒钟让红宝石自行关闭,如果它仍然存在,然后毫不留情地杀死它,但因为大部分时间kill-9都会抱怨过程已经死了。

我知道我已经在方括号前没有使用反斜杠,但是现在我在Ubuntu 12上检查了它,似乎需要它们。 这可能与bash的许多选项和不同Linux发行版的默认配置有关。 希望[和]可以在任何地方工作,但我不能访问服务器,我知道它的工作没有反斜杠,所以我不能确定。

有人建议grep-v,这是我以前做的,但是当我得知[]变体的时候,我认为最好少用一个流程。

作为一个开始,没有必要做一个ps -aux | grep... ps -aux | grep...命令pidof是好得多使用。 几乎从来没有kill -9看到这里

从bash中的命令获得输出,使用类似的东西

 pid=$(pidof ruby) 

或直接使用pkill

选项-v非常重要。 它可以排除一个grep表达式本身

例如

 ps -w | grep sshd | grep -v grep | awk '{print $1}' to get sshd id 

这在Cygwin中有效,但在Linux中也应该有效。

 ps -W | awk '/ruby/,NF=1' | xargs kill -f 

要么

 ps -W | awk '$0~z,NF=1' z=ruby | xargs kill -f 

Bash陷阱

你可以使用命令killall :

 $ killall ruby 

它非常简单。 简单地运行这样的任何程序: – x = gedit&echo $! 这会给你这个过程的PID。 然后做这个杀-9 $ x

杀死shell中的进程

 getprocess=`ps -ef|grep servername` #echo $getprocess set $getprocess pid=$2 #echo $pid kill -9 $pid 

如果你已经知道这个过程,那么这将是有用的:

 PID=`ps -eaf | grep <process> | grep -v grep | awk '{print $2}'` if [[ "" != "$PID" ]]; then echo "killing $PID" kill -9 $PID fi