我正在考虑编写shell脚本作为课程的先决条件,并希望得到一些帮助。我目前正在做一个热身练习,要求我编写一个shell脚本,在执行时会杀死我给出的任何当前正在运行的命令进程。在本练习中,我使用的是“少”。命令(所以要测试我会输入' man ps | less')。
然而,由于这是我写的第一个真实剧本(除了传统的" Hello World!"我已经完成了),我很少被困在怎么开始我搜索了很多内容并返回了一些令人困惑的结果。我知道我需要从一个shebang开始,但我不知道为什么。我正在考虑使用' if'声明;
的内容if 'less' is running
kill 'less' process
fi
但我不确定如何去做。由于我对此非常陌生,我还想确保我正确地编写脚本。我使用记事本作为文本编辑器,一旦我在那里编写了我的脚本,我就将它保存到我在终端中访问的目录,然后从那里运行,对吗?
非常感谢你给我的任何建议或资源。我确信一旦掌握了编写脚本的基础知识,我就能找出更难的练习。
答案 0 :(得分:1)
尝试:
pgrep less && killall less
pgrep less
查看名为less
的任何进程的进程ID。如果找到进程,则返回true,在这种情况下触发&&
子句。 killall less
会终止名为less
的任何进程。
请参阅man pgrep
和man killall
。
这可能会忽略您的练习,但是没有必要测试正在运行的less
进程。跑吧:
killlall less
如果没有less
进程正在运行,则killall
不执行任何操作。
答案 1 :(得分:1)
试试这个简单的代码段:
#!/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
提供的手册页中的表格。
答案 2 :(得分:0)
您可以在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