我正在尝试编写一个脚本来查找之前运行的另一个脚本的PID。一旦找到PID,它就会发送一个终止信号。我发现PID但是杀死信号没有处理,我得到的回报是不是PID。
这就是我在做什么。
#!/bin/bash
PID=`ps -eaf | grep "start.sh" | awk '{print $2}'`
echo "$PID"
if [[ -z "$PID" ]];
then(
echo "Start script is not running!"
)else(
kill -9 $PID
)fi
它试图杀死的脚本会启动许多其他脚本,所以我希望杀死start.sh会杀死所有子进程。
任何帮助/想法都会很棒。谢谢
答案 0 :(得分:1)
当您运行ps -eaf | grep "start.sh" | awk '{print $2}'
时,您会在其中创建一个带有start.sh
字样的子shell。然后grep将在其自己的进程和start.sh
进程中获取,这样您将获得2个PID。这意味着当您尝试同时杀死start.sh
和ps -eaf | grep "start.sh" | awk '{print $2}'
进程时。 start.sh
将会死亡,但另一个将不再存在,因此无法杀死,因此会给您一个错误。
如果您要拆分命令,可能会有更好的运气。
PIDS=$(ps -eaf)
PID=$(echo "$PIDS" | grep "start.sh" | awk '{print $2}')
答案 1 :(得分:1)
尝试使用pgrep
PID=$(pgrep yourprocesname)
答案 2 :(得分:0)
这是另一种可能对某人有用的解决方案:
#!/bin/bash
kill-process-by-name(){
processes=$(ps -A)
kill -9 `echo "$processes" | grep "$1" | cut -f2 -d" "`
}
kill-process-by-name "start.sh"
答案 3 :(得分:0)
您可以使用pidof
而不是ps -ef
PID=`pidof start.sh | awk '{print $1}'`
echo "$PID csshst will be stopped"
if [[ -z "$PID" ]]; then
(
kill -9 $PID
)
fi