V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
wuwenzhx
V2EX  ›  Linux

请教大佬们一个 Shell 脚本,等待所有的后台进程结束

  •  
  •   wuwenzhx · 2018-03-17 00:09:39 +08:00 · 5134 次点击
    这是一个创建于 2203 天前的主题,其中的信息可能已经有所发展或是发生改变。

    开了 3 个后台进程,等待这三个都结才束退出脚本:

    
    (echo aaa >> /dev/null;sleep 10; exit 0)&
    (echo bbb >> /dev/null;sleep 11; exit 1)&
    (echo ccc >> /dev/null;sleep 9; exit 0)&
    for((i=0;i<3;i++)); do
            j=$(echo "$i+1" | bc -l)
            wait %$j
            echo $?
    done
    
    
    这里面的 wait %$j 没搞懂...... 这个% 干嘛的? j 打印出来是 1,2,3 等待 wait %1 %2 %3 什么个意思?
    
    10 条回复    2018-03-17 16:34:42 +08:00
    wuwenzhx
        1
    wuwenzhx  
    OP
       2018-03-17 00:14:09 +08:00
    大佬们都睡了吗?
    extreme
        2
    extreme  
       2018-03-17 00:18:43 +08:00 via iPhone   ❤️ 2
    %n

    n 是任务号。

    执行命令时,在结尾加上&,Shell 就会把命令放到后台运行,同时返回一个任务号。
    使用 Shell 内置命令 jobs 可以查看所有任务。

    wait %n 就是调用系统调用 wait,同步等待任务 n 运行结束,在任务 n 运行结束后才返回。
    wuwenzhx
        3
    wuwenzhx  
    OP
       2018-03-17 00:24:54 +08:00
    多谢大佬的解答:), 之前一直是 wait $pid,没想到还能用%n 这个骚操作..... 这里如果不加% 直接 wait 1 wait2 wait3 就不行了...... 看来这个%n 表示任务号 是 shell 固定的用法
    wuwenzhx
        4
    wuwenzhx  
    OP
       2018-03-17 00:43:13 +08:00
    <pre><code>
    涨知识了 在脚本内加 jobs 确实能看到所有的任务
    [1] Running ( echo aaa >> /dev/null; sleep 10; exit 0 ) &
    [2]- Running ( echo bbb >> /dev/null; sleep 11; exit 1 ) &
    [3]+ Running ( echo ccc >> /dev/null; sleep 9; exit 0 ) &
    在终端运行 jobs 就不行了 哈哈看来我还是很菜啊~~~
    <pre><code>
    arakashic
        5
    arakashic  
       2018-03-17 02:05:32 +08:00
    为什么不用 for((i=1;i<=3;i++)) 啊?
    EricXuu
        6
    EricXuu  
       2018-03-17 08:46:44 +08:00 via Android
    为啥还要 bc 计算?直接 i=1 2 3 不行?
    lee015
        7
    lee015  
       2018-03-17 12:57:24 +08:00
    wait 那里不要循环,前面命令加&后台运行后,最后一行这样就行了: wait $(jobs -p)
    wuwenzhx
        8
    wuwenzhx  
    OP
       2018-03-17 16:31:19 +08:00
    @arakashic 这不是我写的脚本 我也纳闷我老大为什么这样写 可能为了装 X 不想让我们看懂吧 哈哈~~~
    wuwenzhx
        9
    wuwenzhx  
    OP
       2018-03-17 16:33:09 +08:00
    @lee015 大佬好眼力 --!
    wuwenzhx
        10
    wuwenzhx  
    OP
       2018-03-17 16:34:42 +08:00
    @EricXuu 哈哈 可能我老大装 X 不想让人太容易看懂吧
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3146 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 12:32 · PVG 20:32 · LAX 05:32 · JFK 08:32
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.