I am trying to implement a simple log server in Bash. It should take a file as a parameter and serve it on a port with netcat.
( tail -f $1 & ) | nc -l -p 9977
But the problem is that when the netcat terminates, tail is left behind running. (Clarification: If I don't fork the tail process it will continue to run forever even the netcat terminates.)
If I somehow know the PID of the tail then I could kill it afterwards.
Obviously, using $! will return the PID of netcat.
How can I get the PID of the tail process?
The easiest way to find out if process is running is run ps aux command and grep process name. If you got output along with process name/pid, your process is running.
Since PID is an unique identifier for a process, there's no way to have two distinct process with the same PID. Unless the processes are running in a separate PID namespaces (and thus can have the same PID).
Another option: use a redirect to subshell. This changes the order in which background processes are started, so $! gives PID of the tail
process.
tail -f $1 > >(nc -l -p 9977) & wait $!
Write tail's PID to file descriptor 3, and then capture it from there.
( tail -f $1 & echo $! >&3 ) 3>pid | nc -l -p 9977 kill $(<pid)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With