Search code examples
linuxbashstrace

Monitor strace in a loop, restart process when error string is matched


I'm using a proprietary app on my Raspberry Pi 4.

The app has a bug where after a certain amount of time it slows to a crawl. It doesn't fully crash, it just starts performing sub-optimally. The fix is to kill the process and reopen it.

There is a flag in the apps console output I could use to determine that the problem has occurred: "Time taken to process image --249" (249 being the maximum it reports).

Is it possible to set up a .sh file to monitor strace for this process and then kill the process and re-open it? I've done plenty of Googling but I am out of my depth.

I would prefer not to write the strace to a text file and then read from that file. The console output from the application updates 60~ times per second and this would quickly ruin the SD card.

My instinct is to loop through the 10 most recent entries in the strace and look for a string match, but I can't figure our the syntax for that nor if it's even possible.


Solution

  • How about a fairly naive bash wrapper? Since you're using strace and we know it's well behaved when writing to a pipe (it will exit when the pipe stops reading) you should be able to just do something like this:

    #!/bin/bash
    while strace -vF app 2>&1 | grep -q -m1 -- '--249'
    do 
      echo restart 
      sleep X
    done
    

    Adjust the X in the sleep to a suitable value.

    Personally I'd ask the maker of the proprietary app to sort their shit out ;)