我有一个非常简单的问题:当我运行shell脚本时,我启动了一个程序 在无限循环中运行。过了一会儿,我想在此之前停止这个程序 它再次使用不同的参数。现在的问题是如何找到pid的 我执行它时的程序?基本上,我想做那样的事情:
echo "Executing app1 with param1"
./app1 param1 &
echo "Executing app1"
..do some other stuff
#kill somehow app1
echo "Execution of app1 finished!"
谢谢!
答案 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,也可以使用head
或tail
。
以及fish用户的提示:%process
将替换为process
的PID。所以,在鱼类中,你可以使用:
user@desktop ~> kill %app1
答案 3 :(得分:2)
您使用
获取app1的pidps 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}'
可能效率不高,但我更倾向于在这样的任务中交换多功能效率。