我的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命令的第二部分时才会发生。
答案 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