Bash 用于捕获进程ID并将其杀死(如果存在)的Shell脚本

Bash 用于捕获进程ID并将其杀死(如果存在)的Shell脚本,bash,shell,scripting,Bash,Shell,Scripting,我尝试了这个代码,但它不起作用 #!/bin/sh #Find the Process ID for syncapp running instance PID=`ps -ef | grep syncapp 'awk {print $2}'` if [[ -z "$PID" ]] then Kill -9 PID fi 它在awk附近显示错误 请给我任何建议。你可能想写信 `ps -ef | grep syncapp | awk '{print $2}'` 但我同意@PaulR的答案-k

我尝试了这个代码,但它不起作用

#!/bin/sh

#Find the Process ID for syncapp running instance

PID=`ps -ef | grep syncapp 'awk {print $2}'`

if [[ -z "$PID" ]] then
Kill -9 PID
fi
它在awk附近显示错误


请给我任何建议。

你可能想写信

`ps -ef | grep syncapp | awk '{print $2}'`

但我同意@PaulR的答案-
killall-9 syncapp
是一个更好的选择。

实际上最简单的方法是传递kill参数,如下所示:

ps -ef | grep your_process_name | grep -v grep | awk '{print $2}' | xargs kill

希望有帮助。

很多*NIX系统也有其中一个或两个,允许您按名称终止进程。使用它们,您可以避免整个解析
ps
问题。

在某个地方遇到。认为它简单而有用

PID=`ps -ef | grep syncapp 'awk {print $2}'`

if [[ -z "$PID" ]] then
**Kill -9 $PID**
fi
您可以直接使用crontab中的命令

* * * * * ps -lf | grep "user" |  perl -ane '($h,$m,$s) = split /:/,$F
+[13]; kill 9, $F[3] if ($h > 1);'
或者,我们可以把它写成shell脚本

#!/bin/sh
# longprockill.sh
ps -lf | grep "user" |  perl -ane '($h,$m,$s) = split /:/,$F[13]; kill
+ 9, $F[3] if ($h > 1);'
这样叫它crontab

* * * * * longprockill.sh
不确定这是否有帮助,但“kill”的拼写不正确。 它是大写的


试试“杀死”吧。

这对我很有用

PID=`ps -eaf | grep syncapp | grep -v grep | awk '{print $2}'` if [[ "" != "$PID" ]]; then echo "killing $PID" kill -9 $PID fi PID=`ps-eaf | grep syncapp | grep-v grep | awk'{print$2}'` 如果[[“”!=“$PID”];然后 echo“杀死$PID” 杀戮-9美元 fi
请尝试以下脚本:

#!/bin/bash
pgrep $1 2>&1 > /dev/null
if [ $? -eq 0 ]
then
{
    echo " "$1" PROCESS RUNNING "
    ps -ef | grep $1 | grep -v grep | awk '{print $2}'| xargs kill -9
}
else
{
    echo "  NO $1 PROCESS RUNNING"
};fi

为此,我使用命令
pkill

NAME
       pgrep, pkill - look up or signal processes based on name and 
       other attributes

SYNOPSIS
       pgrep [options] pattern
       pkill [options] pattern

DESCRIPTION
       pgrep looks through the currently running processes and lists 
       the process IDs which match the selection criteria to stdout.
       All the criteria have to match.  For example,

              $ pgrep -u root sshd

       will only list the processes called sshd AND owned by root.
       On the other hand,

              $ pgrep -u root,daemon

       will list the processes owned by root OR daemon.

       pkill will send the specified signal (by default SIGTERM) 
       to each process instead of listing them on stdout.

如果代码通过解释器(java、python等)运行,那么进程的名称就是解释器的名称。您需要使用参数--full。这与命令名和参数匹配。

这应该会终止所有与允许终止的grep匹配的进程

-9表示“杀死所有可以杀死的进程”

应该是

kill -9 $PID


看到区别了吗?

为什么不直接使用
killall-syncapp
?如果没有进程运行呢?你看,这个杀戮的过程对我没有帮助。你能建议如何修复上述方法吗。ThanksPID=
ps-ef | grep syncapp'awk{print$2}'
我无法将实际上是进程id的输出获取到PID变量中。这行代码中是否有语法错误或脚本编写错误。不幸的是,我没有找到进程的确切名称。我使用grep“sym”来获取进程。sym是启动进程的脚本名称。因此,我最好使用上述方法终止进程。PID=ps-ef | grep syncapp'awk{print$2}我无法将实际是进程id的输出获取到PID变量中。这行代码中是否有语法错误或脚本编写错误。@user1597811:您编写的与我编写的非常不同:p检查所有引号和管道符号(
|
)的位置。如果进程在java下运行,则这不起作用。我不能用“杀死所有的玻璃鱼”作为例子。我需要使用killall java,但它会杀死所有在java下运行的程序。对于java进程,如果代码通过解释器(java、python等)运行,您可以解析来自jps的值并使用kill-java进程
jps | grep“进程名”| cut-d”“-f“1”| xargs kill-kill
然后进程的名称就是解释器的名称。您需要使用参数
--full
。这与命令名和参数相匹配。
grep“your_进程”|awk'{print$2}
可以简化为只
awk'/your_进程/{print$2}'
这会在杀死您想要杀死的进程之前杀死
grep
进程。为了解决这个问题,可以使用
awk'/[y]我们的_进程/{print$2}'| xargs kill
,但是使用
killall
更好。这可能会产生问题,因为ps-ef也可能给出“grep--color=auto”。所以使用
ps-ef | grep“your|u process”| awk{print$2}| grep-v'grep'| xargs kill
对我不起作用,但如果稍微调整一下:
kill-9$(ps-ef | grep“your process”| grep-v grep | awk{print$2})
它就像一个符咒@reinerpost's之后的所有评论都指向了错误的方向。这是一种常见的反模式;正确的解决方案是使用与自身不匹配的正则表达式,使用Awk意味着您可以而且应该避免
grep
,因为Awk可以做
grep
可以做的任何事情,而无需单独的进程,这对于您需要在系统内存不足、进程不足的情况下运行的工具来说可能非常重要,或者CPU。只要只执行进程的一个实例,就可以正常工作。但是,如果进程的两个或多个实例正在运行呢?不,
-9
表示发送信号9,而不是常规的15。精确的语义是,这个不可捕获的信号终止进程,而不给它运行任何清理代码的机会,这通常是通过在可捕获信号上运行的信号处理程序设置的在尝试解析输入行的部分之前。超级简单且有效。我必须做“sudopkill-9coreaudoid”才能让它工作。只是一个注释,我有一个Java进程,我想杀死它,但是我的pkill版本不存在--full选项,但是-f按预期工作,这是在CentOS 6.4上。这是正确的答案。正确阅读手册页,你会发现很多有用的选项-U,它限制特定用户使用等。
kill -9 $(ps -ef | grep [s]yncapp | awk '{print $2}')
Kill -9 PID
kill -9 $PID