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
trusty 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
need.
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.
The 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
could leverage until
and sleep
commands to check every second until the port
is open:
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!