Shell脚本中的杀戮过程

时间:2009-06-04 17:30:14

标签: linux shell

我有一个非常简单的问题:当我运行shell脚本时,我启动了一个程序 在无限循环中运行。过了一会儿,我想在此之前停止这个程序 它再次使用不同的参数。现在的问题是如何找到pid的 我执行它时的程序?基本上,我想做那样的事情:

echo "Executing app1 with param1"  
./app1 param1 &  
echo "Executing app1"  
..do some other stuff  
#kill somehow app1
echo "Execution of app1 finished!"

谢谢!

7 个答案:

答案 0 :(得分:15)

在大多数shell(包括Bourne和C)中,您在后台启动的最后一个子进程的PID将存储在特殊变量$!中。

#!/bin/bash
./app1 &
PID=$!
# ...
kill $PID

特殊变量部分下有some information here

答案 1 :(得分:5)

在bash中$!扩展为在后台启动的最后一个进程的PID。所以你可以这样做:

./app1 param1 &
APP1PID=$!
# ...
kill $APP1PID

答案 2 :(得分:3)

如果要查找流程的PID,可以使用ps

[user@desktop ~]$ ps h -o pid -C app1

参数-o pid表示您只需要进程的PID,-C app1指定要查询的进程的名称,参数h用于抑制结果表的标题(没有它,你会看到PID本身上方的“PID”标题)。并非如果有多个具有相同名称的进程,则会显示所有PID。

如果要杀死该进程,可能需要使用:

[user@desktop ~]$ kill `ps h -o pid -C app1`

虽然killall更清洁,但如果你只想这样做(如果你不介意杀死所有“app1”进程)。如果您只想分别使用第一个或最后一个PID,也可以使用headtail

以及fish用户的提示:%process将替换为process的PID。所以,在鱼类中,你可以使用:

user@desktop ~> kill %app1

答案 3 :(得分:2)

您使用

获取app1的pid
ps ux | awk '/app1/ && !/awk/ {print $2}'

然后你应该能够杀死它....(但是,如果你有几个app1的实例,你可以杀死所有)

答案 4 :(得分:1)

pidof app1
pkill -f app1

答案 5 :(得分:0)

killall app1

答案 6 :(得分:0)

我有一个问题,我杀死的进程是一个python脚本,我有另一个脚本,也运行python。我不想因为另一个脚本而杀死python。

我用awk来处理这个问题(让myscript成为你的python脚本): 杀死ps -ef|grep 'python myscript.py'|awk '!/awk/ && !/grep/ {print $2}'

可能效率不高,但我更倾向于在这样的任务中交换多功能效率。