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