[RndTbl] Shell exec(2) help?

Gilbert E. Detillieux gedetil at cs.umanitoba.ca
Tue Jun 30 10:36:56 CDT 2020


Adam,

I think you're correct in your assumption about the problem being with 
the pipe.  IIRC, the shell spawns a child to manage each pipeline, so 
that it can properly handle redirects, signals, etc., as it sets up the 
pipeline. In the case of the original Bourne shell, the child shell 
process then does an exec on the last binary in the pipeline, so its 
exit status is used as the exit status of the entire pipeline.

So, the explicit exec you are doing has no real effect, as it's 
happening in a child process, and not the parent shell.

Likely also, YMMV depending on which specific shell you use.

Not sure if this would work better?...

exec sh -c "curl -s $URL/go.sh | sh"

You still have parent & child shell processes, but I'm not sure if 
they'll exit differently.  Maybe you'd need to background the pipeline 
to allow the parent shell to exit, and the background pipeline to take over?

Or just do a loop, as Rob suggested.  :)

Gilbert

On 2020-06-30 10:16 a.m., Adam Thompson wrote:
> I've written a shell script that redownloads itself and re-executes 
> itself, but I'm not quite seeing the behaviour I'd expect out of "exec 
> sh".  Instead of one process, I get an infinite progression of shells 
> that finally blows up when I hit ulimits.
> 
> The script:
> 
> ===BOF===
> curl -s $URL/targets \
> | while read TGTNAME TGTIP ; do
>      (
>          echo -n "."
> 
>          mtr \
>              --interval 0.1 \
>              --gracetime 1 \
>              --timeout 1 \
>              --report-wide \
>              --report-cycles 600 \
>              --show-ips \
>              --aslookup \
>              --no-dns \
>              ${TGTIP} \
>          | awk -f parse.awk -v TGT=${TGTNAME}  \
>          | psql -q -b -h $PGHOST -U $PGUSER $PGDB
>      ) &
>     wait &
> done
> 
> # start all over again
> sleep 60 &
> wait
> curl -s $URL/go.sh | exec sh
> ===EOF===
> 
> The key items are the backgrounding of mtr/awk/psql, which appears to 
> work properly - there's 12 lines in "targets" and I only see 12 
> mtr/awk/psql process groups at a time - the sleeping + waiting (which 
> theoretically reaps all children and grandchildren, I think) and the 
> final "exec".
> 
> Except instead of exec'ing, I run an infinite sequence of shells, each 
> one a child of the previous.  E.g. from pstree(1):
> 
> # pstree -lp 1628
> screen(1628)─┬─bash(1629)───sh(12707)───sh(12854)───sh(12986)───sh(13154)───sh(13309)───sh(13444)───sh(13579)───sh(13709)───sh(13842)───sh(13979)───sh(14101)───sh(14242)───sh(14396)───sh(14530)───sh(14655)───sh(14795)───sh(14935)───sh(15076)───sh(15203)───sh(15353)───sh(15490)───sh(15624)───sh(15753)───sh(15891)───sh(16023)───sh(16154)───sh(16282)───sh(16418)───sh(16551)───sh(16696)───sh(16842)───sh(16975)───sh(17112)───sh(17241)───sh(17388)───sh(17522)───sh(17664)───sh(17824)───sh(17956)───sh(18096)───sh(18233)───sleep(18279) 
> 
> 
> I think the problem has something to do with the fact the final exec is 
> on the RHS of a pipe, and thus is executing inside a subshell, but how 
> do I fix this?
> 
> Thanks,
> -Adam

-- 
Gilbert E. Detillieux        E-mail:  <gedetil at cs.umanitoba.ca>
Dept. of Computer Science    Web:     http://www.cs.umanitoba.ca/~gedetil/
University of Manitoba       Phone:   (204)474-8161
Winnipeg MB CANADA  R3T 2N2  Fax:     (204)474-7609


More information about the Roundtable mailing list