You can't do this in a shell script for an executed subprocess, unfortunately, because if it is in the foreground, bash's own signal handlers (traps) are suspended, and if you fork it into the background, you can't reassign it'sits output. I.e., this is something you have to implement in your application.
#However...
If you can't modify the application (e.g., because you did not write it), you can implement this in a script which serves as a pipe to the log:
#!/bin/bash
trap sighandler INT
function sighandler () {
touch log.txt
exec 1> log.txt
}
echo "$0 $BASHPID"
exec 1> log.txt
count=0;
while read; do
echo $REPLY
done
Let's call this pipetrap.sh. Now we need a separate program to test with, mimicking the application you want to log:
#!/bin/bash
count=0
while [ $count -lt 60 ]; do
echo "$BASHPID Count is now $count"
sleep 2
((count++))
done
That will be test.sh:
> (./test.sh | ./pipetrap.sh) &
./pipetrap.sh 15859
These are two separate processes with separate PIDs. To clear test.sh's output, which is being funnelled through pipetrap.sh:
> rm -f log.txt && kill -s 2 15859
Check:
>cat log.txt
15858 Count is now 6
15858 Count is now 7
15858 Count is now 8
15858, test.sh, is still running and its output is being logged. In this case, no modifications to the application are needed.