【问题标题】:Wait for localhost in bash在 bash 中等待本地主机
【发布时间】:2020-11-04 10:29:36
【问题描述】:

我正在研究如何测试 Create React App。他们使用execa 生成一个node.js 子进程,并使用这个名为wait-for-localhost 的实用程序来确保服务器已正确启动:

const startProcess = execa('yarnpkg', ['start'], options);
await waitForLocalhost({ port });

我如何在 Bash 中做类似的事情?我想运行我的package.json 文件中定义的“启动”脚本,等待服务器在端口 3,000 上运行,然后立即退出进程。

【问题讨论】:

  • ss -lnp | grep 3000 会告诉你是否有进程在监听 3000 端口
  • 是的,但我想启动该进程,测试它是否已运行并开始侦听端口 3000,然后在同一个 Bash 脚本中关闭它。

标签: bash process


【解决方案1】:

你可以这样写:

#!/bin/bash
chk()
{
    ss -lnp | grep -q 3000
    if [[ "$?" == "1" ]]
    then
            echo "No process listening on port 3000 yet"
            sleep 1
            chk $1
    else
            echo "Killing process $1"
            kill -9 $1
    fi
}
npm start &
pid=$!
chk $pid

将 react 应用程序生成到后台,而不是将进程 id 作为 pid。运行函数 chk 并传递 pid。在函数中,使用 ss 输出监听端口并检查是否有任何进程在监听端口 3001。如果没有监听,则回显一条消息并等待一秒钟,然后再次运行该函数。如果 grep 返回一个在 3000 端口上运行的进程,则回显一条消息并终止该进程。

【讨论】:

  • 谢谢。快速提问:“npm start”之后的和号 (&) 的作用是什么?如果我像这样重写那部分,脚本会不会是等效的:pid=$(npm start)
  • & 将 npm 进程运行到后台并释放终端。如果没有 &,npm 进程就会运行到屏幕上。美元!然后获取后台进程的id。
  • 这里可以用nc代替ss吗?
  • nc?你是说 netstat?
猜你喜欢
  • 2011-08-07
  • 2015-02-23
  • 2015-07-09
  • 2022-12-24
  • 1970-01-01
  • 1970-01-01
  • 2019-05-11
  • 2023-04-11
  • 2017-12-19
相关资源
最近更新 更多