介绍
在这个项目中,你将学习如何创建一个脚本,该脚本可以检查某个程序是否正在指定端口上运行,并打印该程序的完整路径;如果没有程序在运行,则打印“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 脚本,该脚本将检查某个程序是否正在指定端口上运行。
打开一个文本编辑器,并在
/home/labex/project目录中创建一个名为get.sh的新文件。添加以下代码以检查是否将端口号作为参数提供:
## 检查是否将端口号作为参数提供 if [ -z "$1" ]; then echo "请提供一个端口号。" exit 1 fi这段代码检查脚本调用时是否带有端口号作为参数。如果没有,它将打印一条错误消息并退出脚本。
添加以下代码以获取端口号:
## 获取端口号 port=$1这段代码将提供的端口号存储在
port变量中。保存
get.sh文件。
检查指定端口上是否有程序正在运行
在这一步中,你将添加代码来检查指定端口上是否有程序正在运行。
将以下代码添加到
get.sh脚本中:## 检查端口是否正在被使用 process=$(lsof -i :$port -sTCP:LISTEN -Fp | sed 's/^p//')这段代码使用
lsof命令检查是否有进程正在监听指定端口。输出结果存储在process变量中。添加以下代码来检查是否有程序正在运行:
## 检查是否有程序正在运行 if [ -z "$process" ]; then echo "OK" else ## 获取程序的完整路径 path=$(ps -p $process -o args=) echo "$path" | awk '{print $1}' fi这段代码检查
process变量是否为空(即指定端口上没有程序正在运行)。如果为空,脚本打印 "OK"。如果有程序正在运行,脚本使用ps命令获取程序的完整路径并打印出来。保存
get.sh文件。
测试 get.sh 脚本
在这一步中,你将测试 get.sh 脚本,以确保它按预期工作。
打开一个终端,并导航到
/home/labex/project目录。使用端口号作为参数运行
get.sh脚本:$ sh get.sh 3000 /usr/lib/code-server/lib/node这应该输出在端口 3000 上运行的程序的完整路径。
使用未被使用的端口号运行
get.sh脚本:$ sh get.sh 43000 OK由于没有程序在端口 43000 上运行,这应该输出 "OK"。
如果脚本按预期工作,你就完成了这个项目。
恭喜你!你已经创建了一个脚本,它可以检查某个程序是否正在指定端口上运行,并打印该程序的完整路径;如果没有程序在运行,则打印 "OK"。
总结
恭喜你!你已经完成了这个项目。你可以在 LabEx 中练习更多实验来提升你的技能。



