From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 15070 invoked from network); 6 Jan 2000 14:40:13 -0000 Received: from sunsite.auc.dk (130.225.51.30) by ns1.primenet.com.au with SMTP; 6 Jan 2000 14:40:13 -0000 Received: (qmail 18964 invoked by alias); 6 Jan 2000 14:39:58 -0000 Mailing-List: contact zsh-users-help@sunsite.auc.dk; run by ezmlm Precedence: bulk X-No-Archive: yes X-Seq: 2837 Received: (qmail 18956 invoked from network); 6 Jan 2000 14:39:57 -0000 Date: Thu, 6 Jan 2000 15:19:42 +0100 From: =?iso-8859-1?Q?Thomas_K=F6hler?= To: zsh-users@sunsite.auc.dk Subject: Re: Prompt expansion, multi-job for Message-ID: <20000106151942.A18295@picard.franken.de> References: <20000106194432.A488@bozar.ihug.com.au> <3874847D.A2ED4AE3@u.genie.co.uk> Mime-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: quoted-printable User-Agent: Mutt/1.1i In-Reply-To: <3874847D.A2ED4AE3@u.genie.co.uk>; from opk@u.genie.co.uk on Thu, Jan 06, 2000 at 01:04:55PM +0100 X-Operating-System: Linux picard 2.2.13 X-Editor: VIM - Vi IMproved 5.6a BETA http://www.vim.org/ X-IRC: tirc-1.2; Nick: jeanluc X-URL: http://home.pages.de/~jeanluc/ On Thu, Jan 06, 2000 at 01:04:55PM +0100, Oliver Kiddle wrote: >=20 > Andre Pang wrote: >=20 > > 2) Is there any way to emulate make's -jn option in the for command? > > This would be *really* useful for SMP systems. Currently, doing someth= ing > > like "for i in ***/***.wav; do l3enc $i; done" doesn't take advantage of > > multiple CPUs (on a Linux system, at least); hacking the for command to > > accept a 'make -j'-like parameter (eg: for -j2 i in *; do l3enc $i; don= e) > > would allow us lucky ones who have SMP systems to do many things simila= r to > > the above without going mad and writing silly Makefiles simply so we can > > utilise make -j. If someone's written a function to do this already (B= art? > > ;) it'd be *very* cool. >=20 > If I'm not mistaken, you should be able to do this by running l3enc as a > background process, i.e. for i in *.wav; do l3enc $i& done. I haven't > got an SMP system available to me to test but I'd assume that it would > allocate different l3enc processes to different processors. Putting the > process in the background means that zsh will get control back > straight-away and can run the next l3enc. Well, bad idea if you have a few hundred wavs :) > The trouble with this is that it will attempt to run all the l3encs > together. If you have say 4 processors, it may be most efficient to run > a maximum of 4 l3encs at once. This would be a bit messy to implement in > Zsh (compared to something like Ada) but can be done. Well - let's try something like this: for i in **/*.wav ; do jspool l3enc "'$i'" ; done jrun 4 Now, we need jspool and jrun. jspool is simple: function jspool() { print $@ >> ~/.zjspool/jobs } Now, jrun: function jrun() { print rm -f ~/.zjspool/jobs >> ~/.zjspool/jobs print 1 > ~/.zjspool/current i=3D0 while [ $i -lt $1 ] ; do zjrun $i &! i=3D$[i+1] done } zjrun is a shell script: #!/usr/bin/zsh while : ; do sleep 1 while [ -f ~/.zjspool/lock ] ; do sleep 5 ; done print $$ >> ~/.zjspool/lock PID=3D$(head -1 ~/.zjspool/lock) if [ $PID -ne $$ ] ; then continue ; fi LINE=3D$(cat ~/.zjspool/current) if [ ! -f ~/.zjspool/jobs ] ; then rm -f ~/.zjspool/lock exit fi JOB=3D$(head -$LINE ~/.zjspool/jobs | tail -1) print $[LINE + 1] > ~/.zjspool/current rm -f ~/.zjspool/lock print -n "$1: " eval $JOB done You get the idea... Ah - you have 4 jobs running, but you want another important job to run in between? echo "XXX" > ~/.zjspool/lock wait for the 4 running jobs to finish run your important other stuff=20 rm ~/.zjspool/lock > Oliver Kiddle CU, Thomas --=20 Thomas K=F6hler Email: jean-luc@picard.franken.de | LCARS - Linux for <>< WWW: http://home.pages.de/~jeanluc/ | Computers on All IRC: jeanluc | Real Starships PGP public key: http://www.mayn.de/users/jean-luc/PGP-Public.asc