• Recent
  • Tags
  • Popular
  • Home
  • Docs
  • Register
  • Login
RetroPie forum home
  • Recent
  • Tags
  • Popular
  • Home
  • Docs
  • Register
  • Login

Mausberry Shutdown Script Doesn't Save Metadata

Scheduled Pinned Locked Moved ControlBlock, PowerBlock & Co.
mausberry
251 Posts 10 Posters 95.2k Views
Loading More Posts
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • H
    hansolo77
    last edited by 20 Jul 2017, 23:56

    This is a request for help from a suggestion made by @pjft :
    https://retropie.org.uk/forum/topic/11704/collections-causing-lockups-white-backgrounds/16

    With the latest additions to EmulationStation to give us collections such as "Last Played", we need to be able to save the metadata when the power shuts down. I'm not sure what I need to add to the shutdown script to make it work. Right now, I've tried to add sudo killall emulationstation right before the command to power off. It doesn't seem to do anything. When I put the command in on an SSH terminal, it works. I think the problem might be because the script isn't waiting for ES to completely shutdown. It's just doing the command then going on to the next one. I tried adding wait after the killall, but all that does it make the terminal display prior to shutting down.

    Little help? :)

    Here is the current script:

    /etc/switch.sh

    #!/bin/bash
    #this is the GPIO pin connected to the lead on switch labeled OUT
    GPIOpin1=23
    #this is the GPIO pin connected to the lead on switch labeled IN
    GPIOpin2=24
    echo "$GPIOpin1" > /sys/class/gpio/export
    echo "in" > /sys/class/gpio/gpio$GPIOpin1/direction
    echo "$GPIOpin2" > /sys/class/gpio/export
    echo "out" > /sys/class/gpio/gpio$GPIOpin2/direction
    echo "1" > /sys/class/gpio/gpio$GPIOpin2/value
    while [ 1 = 1 ]; do
    power=$(cat /sys/class/gpio/gpio$GPIOpin1/value)
    if [ $power = 0 ]; then
    sleep 1
    else
    sudo killall emulationstation
    wait
    sudo poweroff
    fi
    done

    Who's Scruffy Looking?

    1 Reply Last reply Reply Quote 1
    • P
      pjft
      last edited by 21 Jul 2017, 07:55

      A thought:

      For testing purposes, could you edit the script so that, instead of a "wait" statement it echoes something (like "Killing ES...") and a command to actually require a keyboard input to proceed, and then monitor the emulationstation process via top.

      That way you may be able to tell whether the problem is that it takes too long for ES to shutdown, whether it's that sudo killall emulationstation isn't actually killing ES for some reason, etc.

      Just a thought.

      1 Reply Last reply Reply Quote 0
      • C
        cyperghost
        last edited by cyperghost 21 Jul 2017, 10:08

        Maybe this can help - It restarts ES properly!

        /opt/retropie/supplementary/emulationstation/emulationstation.sh
        contains several checks. For the restart-script you first created /tmp/es-restart and then killed the binary emulstionstation.
        Maybe you should create /tmp/es-shutdown/and then kill emulationstation (with specific kill for binary only, not via killall)?

        Just for reminding: The created file will always be removed by emulationstation.sh on next start!

        #!/bin/sh
        esdir="$(dirname $0)"
        while true; do
        rm -f /tmp/es-restart /tmp/es-sysrestart /tmp/es-shutdown
        "$esdir/emulationstation" "$@"
        ret=$?
        [ -f /tmp/es-restart ] && continue
        if [ -f /tmp/es-sysrestart ]; then
        rm -f /tmp/es-sysrestart
        sudo reboot
        break
        fi
        if [ -f /tmp/es-shutdown ]; then
        rm -f /tmp/es-shutdown
        sudo poweroff
        break
        fi
        break
        done
        exit $ret
        1 Reply Last reply Reply Quote 0
        • H
          hansolo77
          last edited by 21 Jul 2017, 20:32

          That's really confusing... :(

          Who's Scruffy Looking?

          C 1 Reply Last reply 21 Jul 2017, 20:51 Reply Quote 0
          • C
            cyperghost @hansolo77
            last edited by cyperghost 21 Jul 2017, 20:51

            @hansolo77 What is confusing you? The /opt/retropie/supplementary/emulationstation/emulationstation.sh was not coded by me. You will find it in your current setup. But this script is responsible for proper restart, reboot und shutdown of ES.

            EDIT: removed bash....Use this instead > v1.2

            1 Reply Last reply Reply Quote 0
            • H
              hansolo77
              last edited by 21 Jul 2017, 21:14

              OK that I can test. :)

              So if I understand, I want to do a kill of the process and not "all"? What about the wait bit? Will that work? The problem I saw was that it ignored it, and just continued on with the poweroff.

              Who's Scruffy Looking?

              1 Reply Last reply Reply Quote 0
              • C
                cyperghost
                last edited by cyperghost 21 Jul 2017, 21:27

                @hansolo77
                You can even remove the sudo poweroff in your script. ES does this for you!
                But I don't know if you are using the Pie also for Kodi or any other programm so if you press Power Off nothing will happen. Try it out and report :)

                In short: you can remove sudo poweroffin your script and then the gamelist will be saved 100% . But then your shutdown-button works only in ES.

                about the wait signal
                you can try
                pkill -f "/opt/retropie/supplementary/.*/emulationstation([^.]|$)" && wait

                But test step by step. If nothing helps then remove sudo poweroff from the GPIO shutdown script and let ES do the proper shutdown for you

                1 Reply Last reply Reply Quote 0
                • H
                  hansolo77
                  last edited by 21 Jul 2017, 22:28

                  How does ES power off? I've never seen it do that before.. I've been able to have it do a restart of ES, a reboot of the Pi, and do a shut down. But when I do the shutdown, it just kills everything running but leaves the power running. The script, provided by Mausberry, tells the circuit everything is off then disconnects the power. As long as I've had the circuit, I've never had it completely cut power when I do a shutdown from within ES.

                  Who's Scruffy Looking?

                  1 Reply Last reply Reply Quote 0
                  • C
                    cyperghost
                    last edited by cyperghost 21 Jul 2017, 22:45

                    @cyperghost said in Mausberry Shutdown Script Doesn't Save Metadata:

                    "/opt/retropie/supplementary/.*/emulationstation([^.]|$)"

                    ES Powers Off through it's script emulationstation.sh

                    I've done a small rework to your gpio-poweroff script!
                    I remarked the changes I made now it should work 100% and you can always use PowerOff button! I've just tested my written part. That worked as I was logged in as user pi - I hope there are no restrictions to file system.

                    @meleu Is coding style better now?

                    #!/bin/bash
                    #this is the GPIO pin connected to the lead on switch labeled OUT
                    GPIOpin1=23
                    #this is the GPIO pin connected to the lead on switch labeled IN
                    GPIOpin2=24
                    echo "$GPIOpin1" > /sys/class/gpio/export
                    echo "in" > /sys/class/gpio/gpio$GPIOpin1/direction
                    echo "$GPIOpin2" > /sys/class/gpio/export
                    echo "out" > /sys/class/gpio/gpio$GPIOpin2/direction
                    echo "1" > /sys/class/gpio/gpio$GPIOpin2/value
                    while [ 1 = 1 ]; do
                    power=$(cat /sys/class/gpio/gpio$GPIOpin1/value)
                    if [ $power = 0 ]; then
                    sleep 1
                    else
                    # End Emulationstation if condition of running binary is true (not tested!)
                    # v1 07/21/17 by cyperghost - Inital run
                    # v1.1 07/22/17 - Added chown command to set right user permission for creating es-shutdown
                    espid=$( pgrep -f "/opt/retropie/supplementary/.*/emulationstation([^.]|$)" ) # PID of binary only
                    if [ "$espid" ]; then # Condition: PID is not equal 0 or empty then use ES shutdown
                    echo "ES binary is running - I'm using ES internal shutdown"
                    touch /tmp/es-shutdown && chown pi:pi /tmp/es-shutdown #v1.1 Change file permission of es-shutdown to user:group pi:pi
                    pkill -f "/opt/retropie/supplementary/.*/emulationstation([^.]|$)"
                    exit
                    else
                    echo "ES binary is closed - I proceed with usual shutdown"
                    fi
                    # End Emulationstation if condition of running binary is true (not tested!)
                    wait
                    sudo poweroff
                    fi
                    done
                    1 Reply Last reply Reply Quote 0
                    • H
                      hansolo77
                      last edited by hansolo77 21 Jul 2017, 23:29

                      I'm home from work now, so I will test this asap!

                      Didn't work. I see in the code you have it doing an echo. That should mean in either case it will display a line indicating which method it is shutting down right? All I'm getting on my screen is:

                      rm: cannot remove "/tmp/es-shutdown": Operation not permitted
                      

                      It does shutudown though, and it looks like it's saving the metadata now. I checked my Last Played before, started a game, checked a game and saw a new "most recent". I then did the shutdown (via the power button). When I booted back up, the "most recent" is now there. Now if I can only figure out how to get that "error" gone. Perhaps a sudu?

                      Who's Scruffy Looking?

                      C 1 Reply Last reply 22 Jul 2017, 07:31 Reply Quote 0
                      • H
                        hansolo77
                        last edited by hansolo77 22 Jul 2017, 00:23

                        I'm trying to figure this out on my own.. here's what I've figured out by looking at the scripts...

                        The script located at:

                        /opt/retropie/supplementary/emulationstation.sh
                        

                        Is doing nothing more than watching the /tmp/ folder for the creation of either "es-restart", "es_sysrestart", or "es_shutdown". At that point, it erases that file then does either a sudo reboot or a sudo poweroff depending on the file it detects. I don't understand why we would be calling this script from the switch script. I mean, the new additions you give the script seem to me like we're identifying the PID (process ID) of ES, then create the "es-shutdown" file for the other script to initiate the shutdown. Then you have a pkill in there, which would make sense, but it looks like (based on the error I get on the screen) the other script is initiating the shutdown, not the switch script. I'm also not sure why you have the path with a .* in it. Isn't that path redundant?

                        opt/retropie/supplementary/.*/emulationstation
                        

                        I know I'm a total newb to this, but I'm trying to understand...

                        Who's Scruffy Looking?

                        1 Reply Last reply Reply Quote 0
                        • H
                          hansolo77
                          last edited by hansolo77 22 Jul 2017, 00:52

                          OK I went back and re-read your initial suggestion @cyperghost, now that I've explored a little more into this. If there is indeed a way to have ES shut down internally prior to initiating the poweroff, that's the best way to do it. But I don't see a method via the emulationstation.sh script to just exit ES. There are only keys to reboot and shutdown. Am I missing something? It looks like all I need is the command to exit ES.

                          Who's Scruffy Looking?

                          1 Reply Last reply Reply Quote 0
                          • C
                            cyperghost @hansolo77
                            last edited by cyperghost 22 Jul 2017, 07:31

                            @hansolo77

                            rm: cannot remove "/tmp/es-shutdown": Operation not permitted

                            Ah... this is caused by your GPIO script seems to be runnig as user "ROOT"
                            So the file es-shutdown is also created by user "ROOT" and can't removed by USER "Pi" which the ES-process belongs to ;)

                            There is a solution! So I told you:

                            cyperghost wrote: That worked as I was logged in as user pi - I hope there are no restrictions to file system.

                            Now if I can only figure out how to get that "error" gone. Perhaps a sudu

                            Out of the error please add touch /tmp/es-shutdown && chown pi:pi /tmp/es-shutdown instead of only touch /tmp/es-shutdown. Pleaso don't mess around with sudo. The process of your script runs already under root, so there is no need to sudo again.

                            The error you've posted is a permission error caused by user root, now we change the file to permit user pi ;)

                            I updated the script posted above, so it should work for all processes now. Can you please test and tell me?

                            I see in the code you have it doing an echo. That should mean in either case it will display a line indicating which method it is shutting down right? All I'm getting on my screen is

                            That's just for troubleshooting and indicating, you can remove or comment the lines with # if it works as you want. I still left the else branch for you (it's a useless code piece for now), maybe you need it for a future condition.

                            I'm also not sure why you have the path with a .* in it. Isn't that path redundant?
                            opt/retropie/supplementary/.*/emulationstation
                            I know I'm a total newb to this, but I'm trying to understand...

                            That's for indicating the binary process and other emulationstations-binaries like emulationstation_kidsmode, emulationstation_powersaver.... without the * you would just kill the ordinary binary emulationstation not more not less. @Buzz and @meleu did a nice job in creating this script. I also appreciate the help of some guys here in the forum so there is no intentention te be called a noob - rookie sounds better :)

                            here are only keys to reboot and shutdown. Am I missing something? It looks like all I need is the command to exit ES.

                            To exit ES: It's an internal c++ command. I never needed to exit ES becasue I always log in via SSH if I need a terminal. So I can't give correct answer here how ES can be proper quitted - maybe via killall emulationstation?

                            As I told you... use the chwon command to change user rights of created file and I've updated the bash script and commented it.


                            EDIT - the script should work so far but there is space for doing some code optimizings:

                            • I think you can remove waitcommand you initiated because I made an exit and give shutdown control back to ES (but only if binary PID was detected! If the ES binary is not detected the GPIO script runs as usual)
                            • If you want you can remove complete else branch (don't remove fi command!)
                            • you can remove or comment my two echo commands to give if-condition out to screen - it can be used for bug hunting
                            1 Reply Last reply Reply Quote 0
                            • H
                              hansolo77
                              last edited by 22 Jul 2017, 16:06

                              I almost posted a big grin, until I restarted... The script now displays just one word on the screen when I hit the power button:

                              Terminated
                              

                              But when the system came back up, my Last Played collection hadn't saved the most recent game I played. So I think we're back to square one again. :(

                              Who's Scruffy Looking?

                              P 1 Reply Last reply 22 Jul 2017, 16:10 Reply Quote 0
                              • P
                                pjft @hansolo77
                                last edited by 22 Jul 2017, 16:10

                                @hansolo77 Just to make sure we're looking at the right part of the problem, what's the result of running ls -lon the folder of the gamelist that should contain the game you last played?

                                Does the date and time of the file match the time when you rebooted? What's the current date and time of that file?

                                1 Reply Last reply Reply Quote 0
                                • H
                                  hansolo77
                                  last edited by 22 Jul 2017, 16:13

                                  The date and time didn't update... I just played a game right before testing 10 minutes ago, I see this:

                                  pi@retropie:~ $ ls -l /opt/retropie/configs/all/emulationstation/gamelists/megadrive/
                                  total 1560
                                  -rw-r--r-- 1 pi pi 1594754 Jul 21 01:26 gamelist.xml
                                  

                                  Who's Scruffy Looking?

                                  1 Reply Last reply Reply Quote 0
                                  • P
                                    pjft
                                    last edited by 22 Jul 2017, 16:15

                                    Got it.

                                    So we're looking at the right end of the problem: it's not saving the metadata.

                                    Also, do you have "Save Metadata on Exit" turned on?

                                    Just wanted to check you're not chasing something from the wrong end.

                                    1 Reply Last reply Reply Quote 0
                                    • H
                                      hansolo77
                                      last edited by hansolo77 22 Jul 2017, 16:17

                                      Yeah.. I've never changed it. Just double checked too... I did, however, launch the game via the Favorites collection rather than from the actual system menu.. gonna test that now.

                                      EDIT - Seems like it liked it ok when I ran it from the system menu.. Gonna further test..

                                      Who's Scruffy Looking?

                                      1 Reply Last reply Reply Quote 0
                                      • P
                                        pjft
                                        last edited by 22 Jul 2017, 16:21

                                        That shouldn't have any effect, to be honest.

                                        1 Reply Last reply Reply Quote 0
                                        • H
                                          hansolo77
                                          last edited by 22 Jul 2017, 16:24

                                          LOL WTF...

                                          Now it's working. I tested a different system from my Favorites, exited back to ES then powered off. That most recent game is now at the top of the Last Played list. Go figure. Maybe it just need to go through a complete "reboot" cycle after editing the script? I've also noticed that the Terminated indicator on the screen has gone away.

                                          Who's Scruffy Looking?

                                          1 Reply Last reply Reply Quote 0
                                          20 out of 251
                                          • First post
                                            20/251
                                            Last post

                                          Contributions to the project are always appreciated, so if you would like to support us with a donation you can do so here.

                                          Hosting provided by Mythic-Beasts. See the Hosting Information page for more information.

                                            This community forum collects and processes your personal information.
                                            consent.not_received