[RndTbl] Shell exec(2) help?
Adam Thompson
athompso at athompso.net
Tue Jun 30 10:16:45 CDT 2020
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
More information about the Roundtable
mailing list