【问题标题】:Kill background running job in subprocess from main process从主进程杀死子进程中的后台运行作业
【发布时间】:2015-02-18 18:30:10
【问题描述】:

我想创建 5 个孩子 function otrok {...} 并在后台运行它们。孩子们在mkfifo $kanal 写信。在所有孩子写完之后,我想杀死tail 进程。

基本上这段代码按预期工作,除了我不知道如何获得tail PID

( tail -f $kanal >> cats & )
for i in $(seq 1 5); do
    ( otrok $i ) &
done
wait #wait for all "( otrok $i ) &" to exit
#DOTO #kill tail in first line

【问题讨论】:

    标签: bash kill jobs pid


    【解决方案1】:

    您可以简单地终止第一个后台作业:

    kill %1
    

    如果你想这样,tail 命令的 pid 可以使用:

    tail -f "$kanal" >> cats &
    pid=$! 
    

    (注意:后台运行tail不需要子shell)


    另外请注意,您可以将seq 命令保存在 bash 中。只需使用

    for i in {1..5} ; do
        ...
    

    【讨论】:

    • 这个任务 ID 为 1 的 kill 任务,但 tail 不是任务,因为它是从子进程开始的...如果我不使用子 shell,那么 wait 将等到 inf.,因为 tail永无止境
    • 我可以从子shell返回pid吗?像这样(tail &; exit &!); PID=$?
    • 您可以wait %1 甚至wait "$pid"。 (就像我展示的那样,将尾巴的 pid 保存在 $pid 中)。您不需要子外壳! wait %1 会是最好的..
    • 你不需要子shell。这有什么好理解的?
    猜你喜欢
    • 1970-01-01
    • 2018-10-14
    • 2013-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多