在Shell脚本中杀死进程

我有一个非常简单的问题:当我运行一个shell脚本,我启动一个运行在无限循环的程序。 过了一段时间,我想停止这个程序,然后再用不同的参数再次执行。 现在的问题是如何在执行时find程序的pid? 基本上,我想要做这样的事情:

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

谢谢!

Solutions Collecting From Web of "在Shell脚本中杀死进程"

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

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

在特殊变量部分有一些信息 。

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

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

如果你想找出一个进程的PID,你可以使用ps

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

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

如果你想杀死这个进程,你可能想要使用:

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

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

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

 user@desktop ~> kill %app1 

你得到app1的pid

 ps ux | awk '/app1/ && !/awk/ {print $2}' 

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

 pidof app1 pkill -f app1 
 killall app1 

我遇到了一个问题,我正在杀死的进程是一个Python脚本,我有另一个脚本,也正在运行Python。 我不想因为其他脚本而杀死python。

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

可能效率不高,但我更愿意在这样的任务中交换效率来实现多功能性。