bash -- 杀死命令脚本 [重复]

Posted

技术标签:

【中文标题】bash -- 杀死命令脚本 [重复]【英文标题】:bash -- kill command script [duplicate] 【发布时间】:2015-12-22 10:29:43 【问题描述】:

我正在研究编写 shell 脚本作为上课的先决条件,并希望得到一些帮助以开始学习。我目前正在做一个热身练习,需要我编写一个 shell 脚本,当执行该脚本时,它将杀死我给出的命令的任何当前正在运行的进程。在这个练习中,我使用了“less”命令(所以为了测试我会输入“man ps | less”)。

但是,由于这是我正在编写的第一个 REAL 脚本(除了传统的“Hello World!”我已经完成的脚本),我有点不知道如何开始。我用谷歌搜索了很多,并返回了一些相当混乱的结果。我知道我需要从 shebang 开始,但我不知道为什么。我正在考虑使用'if'语句;类似于

的东西
if 'less' is running
kill 'less' process
fi

但我不知道该怎么做。由于我对此非常陌生,因此我还想确保我正在正确编写脚本。我使用记事本作为文本编辑器,一旦我在那里编写了我的脚本,我会将它保存到我在终端中访问的目录中,然后从那里运行,对吗?

非常感谢您能给我的任何建议或资源。我敢肯定,一旦我掌握了编写脚本的基础知识,我就能找出更难的练习。

【问题讨论】:

查看pskill 的手册页,您会找到所需的。 【参考方案1】:

试试:

pgrep less && killall less

pgrep less 查找任何名为 less 的进程的进程 ID。如果找到一个进程,它会返回 true,在这种情况下会触发 && 子句。 killall less 杀死任何名为 less 的进程。

参见man pgrepman killall

简化

这可能会错过练习的重点,但实际上没有必要测试 less 进程是否正在运行。运行:

killlall less

如果没有less 进程正在运行,那么killall 什么也不做。

【讨论】:

感谢您的回复。因此,我尝试将其放入文本编辑器并在另一个终端中运行,与运行“less”命令的终端不同,它显示“错误的解释器:不是目录”。当我将目录更改为保存 .txt 的位置时,它声称“找不到命令”。可能出了什么问题? 所以我在我的脚本前面加上了“sh”,现在它似乎在做点什么!在一个终端中,我运行了 'ps |少',然后在另一个中,我的 shell 脚本。它在第一个中说“终止”,所以我认为我们已经做到了!我唯一担心的是,当我运行“ps”时,我看到还有 4 个其他“更少”进程仍然处于活动状态......不应该“killall”摆脱所有这些吗? @KommanderKitten 非常好!顺便说一句,如果你的课程是关于bash,那么运行bash scriptname 可能比运行sh scriptname 更好。在某些系统上,sh 缺少bash 的所有功能。 我会记住这一点的。谢谢! @KommanderKitten "不应该 'killall' 摆脱所有这些吗?" 是的,它应该杀死所有 除了 的那些它缺乏杀戮的权限,例如其他用户运行的权限。【参考方案2】:

试试这个简单的 sn-p:

#!/bin/bash

# if one or more processes matching "less" are running
# (ps will return 0 which corresponds to true in that case):
if ps -C less
then
    # send all processes matching "less" the TERM signal:
    killall -TERM less
fi

有关可用信号的更多信息,请参阅man 7 signal 提供的手册页中的表格。

【讨论】:

感谢您的详尽回复!几个问题:'-C' 有什么作用?另外,对于“-TERM”,一位朋友建议我可以使用“-INT”。有什么区别,哪个更好? 请务必查看man ps 以获取有关-C 的信息。 INTTERM 信号通常都会终止一个进程,但两者都可以在信号处理程序中捕获,该处理程序通常用于在终止之前执行清理任务。如果您在交互式终端会话中按Ctrl+CINT 将被发送到前台进程。无法捕获KILL 信号并立即终止进程。 和John has pointed out一样,不需要检查程序是否正在运行。【参考方案3】:

您可以在 bash 中尝试以下代码:

#Tell which interpreter will process the code
#!/bin/bash

#Creating a variable to hold program name you want to serach and kill
#mind no-space between variable name value and equals sign
program='less'

#use ps to list all process and grep to search for the specific program name
# redirect the visible text output to /dev/null(linux black hole) since we don't want to see it on screen
ps aux | grep "$program" | grep -v grep > /dev/null

#If the given program is found $? will hold 0, since if successfull grep will return 0
if [ $? -eq 0 ]; then
    #program is running kill it with killall
    killall -9 "$program"
fi

【讨论】:

感谢您的回复!你介意带我浏览每一行代码并说明它们的作用吗? @KommanderKitten 我将在代码中添加一些 cmets 以使其具有解释性。

以上是关于bash -- 杀死命令脚本 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

在bash中杀死一个进程[重复]

Bash - 在一段时间后终止命令[重复]

bash: 避免命令重复执行的简单脚本

使用“bash 脚本”将命令发送到“应用程序的外壳”[重复]

Bash命令在终端中有效,但在python脚本中的“子进程”中无效[重复]

从 bash shell 脚本调用 Python 脚本 [重复]