用于捕获进程 ID 并在存在时将其终止的 Shell 脚本[重复]

Posted

技术标签:

【中文标题】用于捕获进程 ID 并在存在时将其终止的 Shell 脚本[重复]【英文标题】:Shell script to capture Process ID and kill it if exist [duplicate] 【发布时间】:2012-12-04 07:24:12 【问题描述】:

我试过这段代码,但它不起作用

#!/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 附近显示错误。

请有任何建议。

【问题讨论】:

为什么不直接使用killall syncapp 没有进程运行怎么办?有没有报错? 见:man killall 这个杀戮过程对我没有帮助。你能建议如何修复上述方法。谢谢 PID=ps -ef | grep syncapp 'awk print $2' 我无法将实际上是进程 ID 的输出转换为 PID 变量。这行代码有没有语法错误或者脚本写错了。 【参考方案1】:
Kill -9 PID

应该是

kill -9 $PID

看到区别了吗?

【讨论】:

【参考方案2】:

这应该会杀死与您被允许杀死的 grep 匹配的所有进程。

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

kill -9 $(ps -ef | grep [s]yncapp | awk 'print $2')

【讨论】:

不,-9 表示发送信号 9 而不是常规的 15。精确的语义是这个不可捕获的信号终止进程,而没有给它运行任何清理代码的机会,这通常是设置的通过在 可捕获 信号上运行的信号处理程序。【参考方案3】:

我为此使用命令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。这与命令名称和参数匹配。

【讨论】:

超级简单且有效。我必须执行“sudo pkill -9 coreaudiod”才能让它工作 请注意,我有一个想要杀死的 Java 进程,但是我的 pkill 版本不存在 --full 选项,但是 -f 按预期工作,这是在 CentOS 6.4 上。 这是正确答案。正确阅读手册页,您会发现很多有用的选项 -U 限制特定用户等。【参考方案4】:

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

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

希望对你有帮助。

【讨论】:

grep "your_process" | awk 'print $2' 可以简化为 awk '/your_process/print $2' 这会带来(小)风险,即在 grep 进程终止您要终止的进程之前终止它。要解决这个问题,请使用awk '/[y]our_process/print $2' | xargs kill,但使用killall 更好。 这可能会出现问题,因为 ps -ef 也可能会给出“grep --color=auto”。所以使用ps -ef | grep "your_process" | awk 'print $2' | grep -v 'grep' | xargs kill 对我不起作用,但如果稍微调整一下:kill -9 $(ps -ef | grep "your process" | grep -v grep | awk 'print $2') 它就像一个魅力;) @reinerpost 之后的所有 cmets 都朝着错误的方向前进。这是一种常见的反模式;正确的解决方案是使用与自身不匹配的正则表达式,并且使用 Awk 意味着您可以而且应该避免使用 grep,因为 Awk 可以完成 grep 可以在没有单独进程的情况下完成的所有操作,这对于工具来说可能非常重要您将需要在系统缺乏内存、进程或 CPU 的情况下运行。【参考方案5】:

试试下面的脚本:

#!/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

【讨论】:

【参考方案6】:

这对我很有用。

PID=`ps -eaf | grep 同步应用程序 | grep -v grep | awk '打印 $2'` 如果 [[ "" != "$PID" ]];然后 回声“杀死$PID” 杀死 -9 $PID 菲

【讨论】:

只要只执行进程的一个实例,它就可以正常工作。但是,如果进程的两个或更多实例正在运行怎么办?【参考方案7】:
#!/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

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

尝试“杀死”。

【讨论】:

【参考方案8】:

许多*NIX 系统也有pkill(1) 和killall(1) 中的一个或两个,允许您按名称杀死进程。使用它们,您可以避免整个解析ps 的问题。

【讨论】:

如果进程在 java 下运行,这将不起作用。例如,我不能使用“killall glassfish”。我需要使用killall java,但它会杀死所有在java下运行的程序。 对于java进程,可以从jps解析值,然后使用kill java进程jps | grep "Process Name" | cut -d " " -f "1" | xargs kill -KILL 如果您的代码通过解释器(java、python、...)运行,那么进程的名称就是解释器的名称。您需要使用参数--full。这与命令名称和参数匹配。【参考方案9】:

在某个地方遇到过..认为它简单实用

可以直接在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

【讨论】:

使用grep | perl 是新奇的useless use of grep -- 当然Perl 在尝试解析输入行之前已经知道如何处理next unless /regex/;【参考方案10】:
PID=`ps -ef | grep syncapp 'awk print $2'`

if [[ -z "$PID" ]] then
**Kill -9 $PID**
fi

【讨论】:

【参考方案11】:

你可能想写

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

但我会赞同 @PaulR 的回答 - killall -9 syncapp 是一个更好的选择。

【讨论】:

不幸的是我没有找到确切的进程名称。我通过使用 grep "sym" 来获取进程。 sym 是启动进程的脚本名称。所以我还是用上面的方法杀掉进程比较好。 PID=ps -ef | grep syncapp 'awk print $2' 我无法将实际上是进程 ID 的输出转换为 PID 变量。这行代码有没有语法错误或者脚本写错了。 @user1597811:你写的和我写的很不一样:p 检查所有引号的位置,以及所有管道符号 (|) 的位置。

以上是关于用于捕获进程 ID 并在存在时将其终止的 Shell 脚本[重复]的主要内容,如果未能解决你的问题,请参考以下文章

自定义操作,用于读取文件并在会话obj中存储值。有没有办法在调用其他自定义操作时将其用作属性

从相机捕获图像并在活动中显示

从 C# 启动 Excel 并在“保存”时将其关闭

从相机捕获图像并在活动中显示

在jQuery中,在鼠标悬停时添加类并在鼠标悬停时将其删除的最佳方法是啥?

运行bash命令并在超过特定时间时将其杀死[重复]