获取满足条件的程序

LinuxBeginner
立即练习

介绍

在这个项目中,你将学习如何创建一个脚本,该脚本可以检查某个程序是否正在指定端口上运行,并打印该程序的完整路径;如果没有程序在运行,则打印“OK”。

👀 预览

## 示例
$ cd /home/labex/project
$ sh get.sh 3000
/usr/lib/code-server/lib/node
$ sh get.sh 43000
OK

🎯 任务

在这个项目中,你将学习:

  • 如何创建一个 Zsh 脚本
  • 如何使用 lsof 命令检查某个端口是否正在被使用
  • 如何使用 ps 命令获取正在运行的程序的完整路径

🏆 成果

完成这个项目后,你将能够:

  • 编写一个可以识别在指定端口上运行的程序的脚本
  • 排查开发环境中与端口冲突相关的问题
  • 自动化检查特定端口上正在运行的程序的过程

创建 get.sh 脚本

在这一步中,你将创建 get.sh 脚本,该脚本将检查某个程序是否正在指定端口上运行。

  1. 打开一个文本编辑器,并在 /home/labex/project 目录中创建一个名为 get.sh 的新文件。

  2. 添加以下代码以检查是否将端口号作为参数提供:

    ## 检查是否将端口号作为参数提供
    if [ -z "$1" ]; then
      echo "请提供一个端口号。"
      exit 1
    fi
    

    这段代码检查脚本调用时是否带有端口号作为参数。如果没有,它将打印一条错误消息并退出脚本。

  3. 添加以下代码以获取端口号:

    ## 获取端口号
    port=$1
    

    这段代码将提供的端口号存储在 port 变量中。

  4. 保存 get.sh 文件。

检查指定端口上是否有程序正在运行

在这一步中,你将添加代码来检查指定端口上是否有程序正在运行。

  1. 将以下代码添加到 get.sh 脚本中:

    ## 检查端口是否正在被使用
    process=$(lsof -i :$port -sTCP:LISTEN -Fp | sed 's/^p//')
    

    这段代码使用 lsof 命令检查是否有进程正在监听指定端口。输出结果存储在 process 变量中。

  2. 添加以下代码来检查是否有程序正在运行:

    ## 检查是否有程序正在运行
    if [ -z "$process" ]; then
      echo "OK"
    else
      ## 获取程序的完整路径
      path=$(ps -p $process -o args=)
      echo "$path" | awk '{print $1}'
    fi
    

    这段代码检查 process 变量是否为空(即指定端口上没有程序正在运行)。如果为空,脚本打印 "OK"。如果有程序正在运行,脚本使用 ps 命令获取程序的完整路径并打印出来。

  3. 保存 get.sh 文件。

测试 get.sh 脚本

在这一步中,你将测试 get.sh 脚本,以确保它按预期工作。

  1. 打开一个终端,并导航到 /home/labex/project 目录。

  2. 使用端口号作为参数运行 get.sh 脚本:

    $ sh get.sh 3000
    /usr/lib/code-server/lib/node
    

    这应该输出在端口 3000 上运行的程序的完整路径。

  3. 使用未被使用的端口号运行 get.sh 脚本:

    $ sh get.sh 43000
    OK
    

    由于没有程序在端口 43000 上运行,这应该输出 "OK"。

  4. 如果脚本按预期工作,你就完成了这个项目。

恭喜你!你已经创建了一个脚本,它可以检查某个程序是否正在指定端口上运行,并打印该程序的完整路径;如果没有程序在运行,则打印 "OK"。

总结

恭喜你!你已经完成了这个项目。你可以在 LabEx 中练习更多实验来提升你的技能。

✨ 查看解决方案并练习✨ 查看解决方案并练习✨ 查看解决方案并练习