几个后台作业完成后如何执行unix命令?

时间:2019-03-24 20:50:39

标签: unix tcsh

我的c-shell代码必须在执行某些unix命令之前完成一些并发的后台作业。但是,以某种方式,我的后台作业在代码中永远不会返回unix命令的句柄。

    $cmd1 | tee $XD/m1.log&
    $cmd2 | tee $XD/m2.log&
    $cmd3 | tee $XD/m3.log&
    $cmd4 | tee $XD/m4.log&

上面提到的所有4条命令都会生成4个不同的文件,分别名为$L1$L2$L3$L4(例如:setenv L1 $XD/div.txt等)。从它们删除第一行后,我需要合并所有这些文件,因此使用了以下逻辑。但是似乎sed命令永远不会执行

   wait $!
   echo "Job completed"
   sed -i '1d' $L2
   sed -i '1d' $L3
   sed -i '1d' $L4
   cat $L1 $L2 $L3 $L4 >> $L

您能帮我做然后执行后台工作吗?

尝试

if (! -e $L4 ) then 
   if ( -f $L4 ) then 
       wait $!
       echo "Job completed"
       sed -i '1d' $L2
       sed -i '1d' $L3
       sed -i '1d' $L4
       cat $L1 $L2 $L3 $L4 >> $L
   endif
endif

但也没有帮助。

   $cmd1 | tee $XD/m1.log&
   $cmd2 | tee $XD/m2.log&
   $cmd3 | tee $XD/m3.log&
   $cmd4 | tee $XD/m4.log&

   if (! -e $L4 ) then 
     if ( -f $L4 ) then 
       wait $!
       echo "Job completed"
       sed -i '1d' $L2
       sed -i '1d' $L3
       sed -i '1d' $L4
       cat $L1 $L2 $L3 $L4 >> $L
     endif
   endif

预期结果将是生成$L文件($XD/final.txt),只有在脚本返回到包含sed命令的第二部分时才会发生。

1 个答案:

答案 0 :(得分:0)

答案简短,只需使用:

wait

wait,不带任何参数等待,将等待所有子进程。 $!是最后一个启动的后台进程的pid,因此wait $!将仅等待进程的最后一个子进程。

长答案,完整脚本已编辑:

#!/bin/env tcsh
set cmd1 = 'printf header\nline11\nline12\n'
set cmd2 = 'printf header\nline21\nline22\n'
set cmd3 = 'printf header\nline31\nline32\n'
set cmd4 = 'printf header\nline41\nline42\n'
set XD = '.'
set L = "${XD}/m.log"
set L1 = "${XD}/m1.log"
set L2 = "${XD}/m2.log"
set L3 = "${XD}/m3.log"
set L4 = "${XD}/m4.log"

touch "${L}" "${L1}" "${L2}" "${L3}" "${L4}" || exit (1)
( ${cmd1}; sleep 5 ) | tee "${L1}" &
( ${cmd2}; sleep 2 ) | tee "${L2}" &
( ${cmd3}; sleep 4 ) | tee "${L3}" &
( ${cmd4}; sleep 3 ) | tee "${L4}" &
wait
echo "Job completed"
cat "${L1}" > "${L}"
sed '1d' "${L2}" >> "${L}"
sed '1d' "${L3}" >> "${L}"
sed '1d' "${L4}" >> "${L}" 

exit (0)

测试:

% ./user3093942.tcsh
[1] 1542 1543
header
line11
line12
[2] 1545 1546
header
line21
line22
[3] 1548 1549
header
line31
line32
[4] 1551 1552
header
line41
line42
[4]  + Done                          ( ${cmd4}; sleep 3 ) | tee ./m4.log
[3]  + Done                          ( ${cmd3}; sleep 4 ) | tee ./m3.log
[2]  + Done                          ( ${cmd2}; sleep 2 ) | tee ./m2.log
[1]  + Done                          ( ${cmd1}; sleep 5 ) | tee ./m1.log
Job completed
% cat ./m.log
header
line11
line12
line21
line22
line31
line32
line41
line42