Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to get the PID of a process that is piped to another process in Bash?

Tags:

bash

pipe

pid

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?

like image 571
Ertuğ Karamatlı Avatar asked Oct 30 '09 22:10

Ertuğ Karamatlı


People also ask

How do I find the PID of a process in Linux?

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.

Can two process have the same PID?

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).


2 Answers

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 $! 
like image 149
VladV Avatar answered Sep 29 '22 00:09

VladV


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) 
like image 44
bobbogo Avatar answered Sep 28 '22 23:09

bobbogo