There comes a time in every software engineer’s life, when they need to run a command, but only after a port has been opened by a completely separate process.
Sure, you could sit around and wait for the port to open up before running your command, but what’s the fun in that?
Plus, if it’s worth waiting around for, it’s worth attempting to automate.
Fortunately, it doesn’t take much to handle this type of scenario. With your
netcat command and a bit of shell scripting, you can pull it off.
While this guide does rely on
netcat, specifically the
nc command, it’s not
a guide to how to install it. If you happen to be running Debian or Ubuntu, I
can help out there, as the
netcat-traditional package will get you what you
All right, so we need to wait for a port to open, checking periodically in a
loop before running another command. Before we get into all of that, let’s talk
about using the
nc command by itself to see if a port is open.
nc command can accept an address and a port and report back the status if
the connection is refused:
% nc 0.0.0.0 3000 (UNKNOWN) [0.0.0.0] 3000 (?) : Connection refused
If the port was open, the
nc command would just sit there, as it’s actively
connected to the address.
To avoid this, you can use the
-z argument, which tells
nc to go into what
they call “zero-I/O mode”, which will exit, regardless if it connects or not.
% nc 0.0.0.0 3000 && echo 'This only runs if the port is open'
Fantastic, we could run this over and over until the port is open, or… we
sleep commands to check every second until the port
until nc -z 0.0.0.0 3000; do sleep 1; done && echo 'Port 3000 is now open!'
Moving in the right direction, if we wanted to really class things up, we could
add some additional
echo statements to give us some additional feedback so
that we can tell it’s working:
echo -n 'Waiting for port 3000 to open...' \ && until nc -z 0.0.0.0 3000; \ do sleep 1 && echo -n .; done \ && echo '\nPort 3000 is now open!'
Now we’ll see the
... continue to grow every second as
nc is checking,
ultimately running the final command in the chain!