[kwlug-disc] bash subprocesses & traps

John Steel john at jskw.ca
Sun Jul 28 13:28:47 EDT 2024


Oh! That's a neat idea, will try it out but I still want to understand what I'm doing wrong with my trap. 

I think my wait on cat is causing a problem. Maybe I should be putting my whole while loop into a subshell?

On Sun, Jul 28, 2024, at 12:56 PM, Chris Frey wrote:
> I'd recommend using some other mechanism of "end of stream" rather
> than killing your script, since, as you found out, it halts all processing.
> 
> Perhaps instead of kill, rename the file:
> 
> echo "More data to hash" > $FIFO_FILE
> # rename it so while loop exits
> mv "$FIFIO_FILE" "$FIFO_FILE-finished"
> # send empty data to trigger a fifo pipe close on the waiting cat
> cat /dev/null > "$FIFO_FILE-finished"
> 
> - Chris
> 
> 
> On Sun, Jul 28, 2024 at 12:18:43PM -0400, John Steel via kwlug-disc wrote:
> > I’m having trouble figuring out how to manage a subprocess… I’m probably overcomplicating this… 
> > 
> > I’ve made a script called checksum.sh. I want it to keep moving data from a fifo to sha256sum until it’s terminated. But it seems when I kill it the cat and sha256sum are gone before my finalize method is called? If I can kill cat and let that sub shell exit gracefully I think I should see the sha256sum come out on stderr. 
> > 
> > #!/bin/bash
> > # This is checksum.sh
> > 
> > FIFO_FILE="${FIFO_FILE:-sha256sum_fifo}"
> > CAT_PID_FILE="$(mktemp -p /dev/shm $$_cat_pid.XXXXXX)"
> > export CAT_PID_FILE FIFO_FILE
> > mkfifo "$FIFO_FILE"
> > 
> > finalize() {
> >     pgrep -fl "cat fifo $FIFO_FILE" > /dev/stderr
> >     pgrep -fl sha256sum > /dev/stderr
> >     
> >     cat_pid="$(cat "$CAT_PID_FILE")"
> >     rm "$CAT_PID_FILE"
> >     kill -s SIGTERM "$cat_pid" && wait "$cat_pid"
> >     exit 0
> > }
> > 
> > trap finalize SIGTERM
> > trap finalize SIGHUP 
> > trap finalize SIGINT 
> > trap finalize SIGQUIT 
> > 
> > # Start the cat process and capture its PID
> > while [ -f "$CAT_PID_FILE" ]; do 
> >     cat "$FIFO_FILE" & cat_pid=$!
> >     echo "$cat_pid" > "$CAT_PID_FILE"
> >     wait "$cat_pid"
> >     sleep 0.01
> > done | sha256sum > /dev/stderr
> > 
> > Here’s how I’m running it: 
> > 
> > docker run -it -v $PWD:/app alpine sh -xc '
> >   apk add bash procps
> >   export FIFO_FILE="$(mktemp -u -p /dev/shm fifo_$$.XXXXXX)"
> >   bash -x /app/checksum.sh &
> >   sleep 0.2
> >   jobs
> >   ps -ef --forest
> >   echo "First data to hash" > $FIFO_FILE
> >   sleep 0.2
> >   ps -ef --forest
> >   echo "More data to hash" > $FIFO_FILE
> >   kill %1
> >   sleep 1
> > ‘
> > 
> > Am I missing something obvious? If it’s possible without the loop that’d be great too but I found that if I connect sha256sum directly to the fifo it exits after the first write to the fifo.
> > 
> > Should I learn how to use socat for this? From a few of the things I’ve read it sounds like it could make this simpler? 
> 
> 
> 
> > _______________________________________________
> > kwlug-disc mailing list
> > To unsubscribe, send an email to kwlug-disc-leave at kwlug.org
> > with the subject "unsubscribe", or email
> > kwlug-disc-owner at kwlug.org to contact a human being.
> 
> 
> _______________________________________________
> kwlug-disc mailing list
> To unsubscribe, send an email to kwlug-disc-leave at kwlug.org
> with the subject "unsubscribe", or email
> kwlug-disc-owner at kwlug.org to contact a human being.
> 
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.kwlug.org/pipermail/kwlug-disc_kwlug.org/attachments/20240728/5fc6eb42/attachment.htm>


More information about the kwlug-disc mailing list