我已经编写了一个非常长且适度复杂的Bash脚本,这使我可以非常轻松地使用所选选项启动我的Node服务器......问题是它无法正常工作。
给我带来麻烦的部分就在这里......
if netstat -an | grep ":$REQUESTED_PORT" > /dev/null
then
SERVICE_PIDS_STRING=`lsof -i tcp:$REQUESTED_PORT -t`
OLD_IFS="$IFS"
IFS='
'
read -a SERVICE_PIDS <<< "${SERVICE_PIDS_STRING}"
IFS="$OLD_IFS"
printf 'Port is in use by the following service(s)...\n\n-------------------\n\nProcess : PID\n\n'
for PID in "${SERVICE_PIDS[@]}"
do
PROCESS_NAME=`ps -p $PID -o comm=`
printf "$PROCESS_NAME : $PID\n"
done
printf "\n-------------------\n\nPlease kill the procceses utilizing port $REQUESTED_PORT and run this script again...exiting.\n"
exit
此脚本的预期功能是使用netstat
来测试请求的端口是否正忙。如果是这样,它会使用端口报告PID,以便用户可以根据需要杀死它们。
我很确定这是我使用netstat
的方式的问题。有时,即使没有使用该端口,netstat
if语句也会触发。 lsof
工作正常,并且不会使用该端口报告任何PID。
但是,当脚本最后一次出现此错误时,我声明了REQUESTED_PORT
,然后运行了netstat -an | grep ":$REQUESTED_PORT"
。 shell没有报告任何内容。
导致它在不适当的时间点火的情况有什么问题?
修改
我还应该提一下,这台机器正在运行Debian Jessie。
答案 0 :(得分:2)
您正在搜索大量文字,并且您想要的数字可以显示在任何地方。最好缩小搜索范围;并且您可以在同一步骤中获取PID和进程名称。其他一些优化如下:
# upper case variable names should be reserved for the shell
if service_pids_string=$(lsof +c 15 -i tcp:$requested_port)
then
# make an array with newline separated string containing spaces
# note we're only setting IFS for this one command
IFS=$'\n' read -r -d '' -a service_pids <<< "$service_pids_string"
# remove the first element containing column headers
service_pids=("${service_pids[@]:1}")
printf 'Port is in use by the following service(s)...\n\n-------------------\n\nProcess : PID\n\n'
for pid in "${service_pids[@]}"
do
# simple space-separated text to array
pid=($pid)
echo "${pid[0]} : ${pid[1]}"
done
# printf should be passed variables as parameters
printf "\n-------------------\n\nPlease kill the procceses utilizing port %s and run this script again...exiting.\n" $requested_port
fi
您应该通过shellcheck.net运行脚本;它可能会找到我没有的其他潜在问题。