[mythtv-users] CTRL-ALT-BACKSPACE -> multiple instances of mythfrontend

Allen Edwards allen.p.edwards at gmail.com
Tue Mar 12 20:28:48 UTC 2019


On Tue, Mar 12, 2019 at 7:30 AM Allen Edwards <allen.p.edwards at gmail.com>
wrote:

>
>
> On Tue, Mar 12, 2019 at 3:53 AM Stephen Worthington <
> stephen_agent at jsw.gen.nz> wrote:
>
>> On Mon, 11 Mar 2019 09:41:08 -0700, you wrote:
>>
>> >On Sun, Mar 10, 2019 at 7:31 PM Stephen Worthington <
>> >stephen_agent at jsw.gen.nz> wrote:
>> >
>> >> On Sun, 10 Mar 2019 14:59:19 -0700, you wrote:
>> >>
>> >> >I added a 10 second delay and the problem is gone, no duplicate
>> instances
>> >> >of myth. Maybe 3 seconds would work but definitely a race condition.
>> >> Other
>> >> >than the delay, the code is the same as original.
>> >> >
>> >> >In fairness to the code, my test is not real life.  Typically if I
>> were to
>> >> >do a CTRL-ALT-BS it would be because myth was frozen or missing. I
>> don't
>> >> >know that I ever did a CTRL-ALT-BS just as a test with Myth running.
>> The
>> >> >timing might be different and the service might be killed faster if
>> it is
>> >> >actually frozen. Or maybe I am wrong and this really is an issue.
>> Either
>> >> >way, it should not keep piling on instances of mythfrontend.  But at
>> least
>> >> >I think we know what is going on now.
>> >> >
>> >> >Allen
>> >>
>> >> Using a delay to fix a race condition is usually a bad idea -
>> >> something happens which changes the timing, such as a bit of swapping
>> >> going on, and then the problem is back again.
>> >>
>> >> Unfortunately, mythfrontend does die quite often for me.  The usual
>> >> cause is playing a downloaded video file.  I have quite a few that it
>> >> can not handle, and either it dies, or locks up and I have to kill it.
>> >> Some of the deaths leave behind "assert failed" messages.  But if you
>> >> do not normally play such files, then mythfrontend can be very
>> >> reliable and not need the wrapper script.
>> >>
>> >> It looks like the wrapper script needs to be able to detect that the
>> >> script itself is still running and to exit if it can see another copy
>> >> of itself.  This should work to do that:
>> >>
>> >> pid=$(ps -ef | grep '/bin/sh /usr/bin/mythfrontend --service' | grep
>> >> -v grep | awk '{print $2}')
>> >> if [ ${#pid} -ne 0 ]; then
>> >>     exit 0
>> >> fi
>> >> _______________________________________________
>> >>
>> >> I do not understand why this does not work but I am no script expert
>> so I
>> >am not sure what exactly is going on with ${#pid} and how that relates to
>> >the initial pid. Perhaps there is a $ missing or misplaced on the first
>> >line?  I did run some tests.
>> >
>> >*dad at NewMyth:~$ ps -ef | grep '/bin/sh /usr/bin/mythfrontend --service'
>> |
>> >grep -v grep*
>> >*dad       2310     1  0 09:17 ?        00:00:00 /bin/sh
>> >/usr/bin/mythfrontend --service*
>> >*dad       2605     1  0 09:17 ?        00:00:00 /bin/sh
>> >/usr/bin/mythfrontend --service*
>> >*dad       2961  2939  0 09:17 ?        00:00:00 /bin/sh
>> >/usr/bin/mythfrontend --service*
>> >
>> >And
>> >
>> >*dad at NewMyth:~$ ps -ef | grep '/bin/sh /usr/bin/mythfrontend --service'
>> |
>> >grep -v grep | awk '{print $2}'*
>> >*2310*
>> >*2605*
>> >*2961*
>> >
>> >For now I will just run mythfrontend without the --service option.  That
>> >should be fine for my needs. I am still willing to troubleshoot this if
>> you
>> >think that would be useful so let me know.
>> >
>> >I wish to thank both Stephen and Ian for your help.
>> >
>> >Allen
>>
>> $(#pid} is the number of characters in the $pid string.  If there are
>> any copies of mythfrontend running, then the $pid string should be a
>> list of the PIDs for those copies (actually, a list of the PIDs of the
>> bash tasks running those copies of the scripts).  So if there are no
>> other copies of mythfrontend running, $pid should be an empty string,
>> and ${#pid} should be 0.  I tested it using this script (t1.sh):
>>
>> #!/bin/bash
>> pid=$(ps -ef | grep '/bin/sh /usr/bin/mythfrontend --service' | grep
>> -v grep | awk '{print $2}')
>> echo $pid
>> echo ${#pid}
>> if [ ${#pid} -ne 0 ]; then
>>     echo "pid != 0"
>> fi
>>
>> On my MythTV box, it displays the "pid != 0" string whenever it finds
>> a copy of the mythfrontend script running.  If I add an extraneous
>> character to the grep string (eg an extra d on the end of
>> "mythfrontend", it gets no matches and continues on to the end of the
>> script without doing the echo.
>> _______________________________________________
>>
>> I have not tested it yet but I think the problem I had was I copied and
> pasted the script you wrote without changes and the word wrap that put a
> return between grep and -v grep would generate an error.  I tested the
> components of it but put it all on one line when I did that and did not
> realize that the script would not run as posted.  Pretty stupid mistake on
> my part.
>
> Your script as it came across the email
> pid=$(ps -ef | grep '/bin/sh /usr/bin/mythfrontend --service' | grep
> -v grep | awk '{print $2}')
> if [ ${#pid} -ne 0 ]; then
>     exit 0
> fi
>
> A corrected version
> pid=$(ps -ef | grep '/bin/sh /usr/bin/mythfrontend --service' | grep -v
> grep | awk '{print $2}')
> if [ ${#pid} -ne 0 ]; then
>     exit 0
> fi
>
> I would be shocked if this did not work but can't test it now.
>
> Allen
>
>
>
I put these lines in the beginning of /usr/share/mythtv/mythfrontend.sh

*pid=$(ps -ef | grep '/bin/sh /usr/bin/mythfrontend --service' | grep -v
grep | awk '{print $2}')*
*if [ ${#pid} -ne 0 ]; then*
*    exit 0*
*fi*

Myth would not start at power up or on a CTRL-ALT-BS.   I cannot find my
error.

Back to no *--service* option

Allen
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mythtv.org/pipermail/mythtv-users/attachments/20190312/00960d47/attachment.html>


More information about the mythtv-users mailing list