我有一个 shell 脚本来检查端口状态。检查端口是否繁忙后,将杀死它。
#check port and kill
checkPort(){
check=$(sudo netstat -nlpt | grep 2020 | awk '{print $6}')
word="LISTEN"
killProcess=$(sudo netstat -nlpt | grep 2020 | awk '{print $7}' |
sed 's/.\{5\}$//' | sort -u | xargs -t kill -9)
if [[ "$check" == "$word" ]];
then
echo "killing the port 2020"
$killProcess
else
echo "Not Listen"
fi
}
当我运行$killProcess
变量时,我遇到了错误。但是,如果我将完整的命令sudo netstat -nlpt | grep 2020 | awk '{print $7}' | sed 's/.\{5\}$//' | sort -u | xargs -t kill -9
放在if
条件内,它就可以正常工作。这里会有什么错误?
我得到的错误:
kill -9
Usage:
kill [options] <pid|name> [...]
Options:
-a, --all do not restrict the name-to-pid conversion to processes
with the same uid as the present process
-s, --signal <sig> send specified signal
-q, --queue <sig> use sigqueue(2) rather than kill(2)
-p, --pid print pids without signaling them
-l, --list [=<signal>] list signal names, or convert one to a name
-L, --table list signal names and numbers
-h, --help display this help and exit
-V, --version output version information and exit
我把xargs -i kill -kill {}
而不是xargs kill -9
. 工作正常。这是一个好习惯吗?
语法
var=$(command)
将运行command
并将其输出分配给变量$var
。这意味着脚本中的这一行:将始终运行以命令结尾的管道
kill
,并将其输出分配给$killprocess
. 由于该kill
命令没有输出,因此后面的这一行将永远不会做任何事情:你想做的是
killProcess="sudo netstat ... | xargs -t kill -9
。但是您的命令也存在其他问题。首先,它将匹配任何包含 2020 的行,但您只需要2020
端口所在的情况。如果它是 PID 怎么办?这是您的功能的工作版本,有一些更改:
这现在可以带一个参数,因此运行它
checkport
来检查端口 2020,checkport 22
并将检查端口 22。它还首先尝试优雅地终止(kill -9
除非绝对必要,否则您应该始终避免)并且仅kill -9
在失败时使用。