测试端口是否与bash和netstat一起使用?

时间:2016-03-02 01:24:44

标签: bash netstat lsof

我已经编写了一个非常长且适度复杂的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。

1 个答案:

答案 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运行脚本;它可能会找到我没有的其他潜在问题。