[kwlug-disc] bash subprocesses & traps

John Steel john at jskw.dev
Mon Aug 5 12:26:35 EDT 2024


I’m just using docker for testing; I was hoping to be able to have a bash script that could spawn a process, and send stuff in and out of it. I might need to do an expect script but I don’t like expect scripts. Python might also be a better choice than bash. But I was hoping to see if there was a clean way to do it just with bash. So far everything I’ve done hasn’t been that clean. 

> On Aug 3, 2024, at 9:51 PM, Andres Vargas - zodman <zodman at gmail.com> wrote:
> 
> I do not know if  it works for you but to manage processes inside docker I use supervisord
> 
> http://supervisord.org/
>  
> you can run the bash script with supervisor  once the process running then  you can  pass the files to FIFO_FILE
> when you don't need the script only stop supervisors and that will stop the process...
> 
> On Sun, Jul 28, 2024 at 12:22 PM John Steel via kwlug-disc <kwlug-disc at kwlug.org <mailto:kwlug-disc at kwlug.org>> 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 <mailto:kwlug-disc-leave at kwlug.org>
>> with the subject "unsubscribe", or email
>> kwlug-disc-owner at kwlug.org <mailto: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/20240805/2cbcf962/attachment.htm>


More information about the kwlug-disc mailing list