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
但我不知道该怎么做。由于我对此非常陌生,因此我还想确保我正在正确编写脚本。我使用记事本作为文本编辑器,一旦我在那里编写了我的脚本,我会将它保存到我在终端中访问的目录中,然后从那里运行,对吗?
非常感谢您能给我的任何建议或资源。我敢肯定,一旦我掌握了编写脚本的基础知识,我就能找出更难的练习。
【问题讨论】:
查看ps
和kill
的手册页,您会找到所需的。
【参考方案1】:
试试:
pgrep less && killall less
pgrep less
查找任何名为 less
的进程的进程 ID。如果找到一个进程,它会返回 true,在这种情况下会触发 &&
子句。 killall less
杀死任何名为 less
的进程。
参见man pgrep
和man 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
的信息。 INT
和 TERM
信号通常都会终止一个进程,但两者都可以在信号处理程序中捕获,该处理程序通常用于在终止之前执行清理任务。如果您在交互式终端会话中按Ctrl
+C
,INT
将被发送到前台进程。无法捕获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 脚本”将命令发送到“应用程序的外壳”[重复]