我试图在Bash中实现一个简单的日志服务器.它应该将文件作为参数并在具有netcat的端口上提供.
( tail -f $1 & ) | nc -l -p 9977
Run Code Online (Sandbox Code Playgroud)
但问题是当netcat终止时,尾巴会被遗忘.(澄清:如果我不分叉尾程,它将继续运行,即使netcat终止.)
如果我以某种方式知道尾巴的PID然后我可以杀死它.
显然,使用$!将返回netcat的PID.
如何获得尾部过程的PID?
Vla*_*adV 39
另一种选择:使用重定向到子shell.这会改变后台进程的启动顺序,所以$!给出tail过程的PID .
tail -f $1 > >(nc -l -p 9977) &
wait $!
Run Code Online (Sandbox Code Playgroud)
小智 38
将尾部的PID写入文件描述符3,然后从那里捕获它.
( tail -f $1 & echo $! >&3 ) 3>pid | nc -l -p 9977
kill $(<pid)
Run Code Online (Sandbox Code Playgroud)
小智 15
这个怎么样:
jobs -x echo %1
Run Code Online (Sandbox Code Playgroud)
%1用于链中的第一个作业,%2用于第二个等等jobs -x.用PID替换作业说明符.
小智 9
这对我有用(SLES Linux):
tail -F xxxx | tee -a yyyy &
export TAIL_PID=`jobs -p`
# export TEE_PID="$!"
Run Code Online (Sandbox Code Playgroud)
ps|grep|kill如果用户可以在同一台机器上运行两个"实例"的脚本,则此线程中提到的技巧将无效.
jobs -x echo %1没有为我工作(手册页没有-x标志),但给了我尝试的想法jobs -p.
也许你可以使用fifo,这样你就可以捕获第一个进程的pid,例如:
FIFO=my_fifo
rm -f $FIFO
mkfifo $FIFO
tail -f $1 > $FIFO &
TAIL_PID=$!
cat $FIFO | nc -l -p 9977
kill $TAIL_PID
rm -f $FIFO
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
32068 次 |
| 最近记录: |