Linux bash—kill命令脚本

Linux bash—kill命令脚本,linux,bash,shell,Linux,Bash,Shell,我正在研究将编写Shell脚本作为类的先决条件,并希望获得一些入门帮助。我目前正在做一个热身练习,要求我编写一个shell脚本,当执行该脚本时,将终止我给出的命令的任何当前正在运行的进程。在本练习中,我使用'less'命令(因此为了测试,我将输入'manps | less') 然而,由于这是我写的第一个真正的剧本(除了我写的传统的“Hello World!”之外),我对如何开始有点困惑。我被谷歌搜索了很多次,并返回了一些相当混乱的结果。我知道我需要从一个shebang开始,但我不知道为什么。我在

我正在研究将编写Shell脚本作为类的先决条件,并希望获得一些入门帮助。我目前正在做一个热身练习,要求我编写一个shell脚本,当执行该脚本时,将终止我给出的命令的任何当前正在运行的进程。在本练习中,我使用'less'命令(因此为了测试,我将输入'manps | less')

然而,由于这是我写的第一个真正的剧本(除了我写的传统的“Hello World!”之外),我对如何开始有点困惑。我被谷歌搜索了很多次,并返回了一些相当混乱的结果。我知道我需要从一个shebang开始,但我不知道为什么。我在考虑使用“如果”语句;类似于

if 'less' is running
kill 'less' process
fi
但我不知道该怎么做。因为我在这方面非常新,所以我还想确保我正在正确地编写脚本。我使用记事本作为文本编辑器,一旦我在那里编写了脚本,我会将它保存到一个我在终端中访问的目录中,然后从那里运行,对吗


非常感谢您提供的任何建议或资源。我确信,一旦我掌握了写剧本的基本知识,我就能想出更难的练习

您可以在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
尝试:

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

请参见
man pgrep
man killall

简化 这可能没有抓住练习的重点,但实际上没有必要测试
less
进程的运行情况。只需运行:

killlall less

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

试试这个简单的代码片段:

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

查看
ps
kill
的手册页,您将找到所需信息。感谢您的回复!你介意带我看一下每一行代码并说明它们的作用吗?@KommanderKitten我会在代码中添加一些注释来解释。谢谢你的全面回复!几个问题:'-C'做什么?另外,对于'-TERM',一位朋友建议我可以使用'-INT'。区别是什么?哪一个更好?请务必查看
manps
,了解
-C
的信息。
INT
TERM
信号通常都会终止进程,但两者都可以在信号处理程序中捕获,信号处理程序通常用于在终止前执行清理任务<如果在交互式终端会话中按Ctrl+
C
,则code>INT将被发送到前台进程。无法捕获
KILL
信号并立即终止进程。因此,无需检查程序是否正在运行。感谢您的回复。所以我试着把它放到一个文本编辑器中,在另一个终端上运行它,与运行“less”命令的终端不同,它说“糟糕的解释器:不是目录”。当我将目录更改为保存my.txt的目录时,它声称“找不到命令”。可能出了什么问题?所以我在我的脚本前面加了“sh”,现在它似乎在做些什么!在一个终端中,我运行了“ps | less”,然后在另一个终端中运行了shell脚本。第一个写着“终止”,所以我想我们已经完成了!我唯一关心的是,当我运行“ps”时,我发现还有4个“更少”进程仍然处于活动状态。。。“杀戮者”不应该把它们全部除掉吗?@KommanderKitten非常好!顺便说一下,如果您的课程是关于
bash
,那么运行
bash scriptname
可能比运行
sh scriptname
更好。在某些系统上,
sh
缺少
bash
的所有功能。我会记住这一点。谢谢大家!@KommanderKitten“难道‘killall’不应该把它们全部杀掉吗?”是的,它应该杀掉所有的东西,除了那些它没有杀掉权限的东西,比如那些由其他用户运行的东西。
#!/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