Mausberry Shutdown Script Doesn't Save Metadata
-
So I think it we should provide and maintain v1.2 only!
Get the version for Mausberry circuits shutdowns from hereThank @hansolo77 for testing this
This script will properly shutdown ES and saves it's metadata if you press power button on your mausberry circuit!- Metadata is needed to save scraped games, favorites and last played record upon next reboot
- This script will work if your are in EmulationsStation
- This script will not properly save metadata if you shutdown during gameplay or if your RPi is locked (So return to ES by pressing start+select on your gampad and then shutdown!)
# End Emulationstation if condition of running binary is true # v1.0 07/21/17 by cyperghost - Inital run # v1.1 07/22/17 - Added chown command to set right user permission for creating es-shutdown # v1.2 07/23/17 - Some small improvments, easier to maintain, removed echo, removed else branch # greetings @pjft for his famous favorits and @meleu for the RegEx sniplet espid=$( pgrep -f "/opt/retropie/supplementary/.*/emulationstation([^.]|$)" ) # detect PID of ES binary only if [ "$espid" ]; then # Condition: PID is not equal 0 or empty then use ES shutdown touch /tmp/es-shutdown && chown pi:pi /tmp/es-shutdown #v1.1 Change file permission of es-shutdown to user:group pi:pi kill $espid #v1.2 use kill@detected PID - easier to maintain now! exit fi # End Emulationstation if condition of running binary is true
-
EXPERIMENTAL!!!
Converted from @meleu to kill all emulators
It worked (saved recently used games) for me in SSH but I've no chance to test >> lack of mausberry!# End Emulationstation if condition of running binary is true (Shotgun-version - no support!) # v1.0 07/21/17 by cyperghost - Inital run # v1.1 07/22/17 - Added chown command to set right user permission for creating es-shutdown # v1.2 07/23/17 - Some small improvments, easier to maintain, removed echo, removed else branch # v1.4 07/25/17 - Shotgun method to terminate all launchs by runcommand (not maintained, use v1.2 for support) # greetings @pjft for his famous favorits and @meleu for the RegEx sniplet espid=$( pgrep -f "/opt/retropie/supplementary/.*/emulationstation([^.]|$)" ) # detect PID of ES binary only if [ "$espid" ]; then #### Experimental part #### IFS=" " set – $( sed -n 4p /dev/shm/runcommand.info ) > /dev/null 2>&1 pkill $2 && sleep 4 # v1.4 Sleeptimer to give ES chance to save XML filestate (untestested) #### Experimental part #### touch /tmp/es-shutdown && chown pi:pi /tmp/es-shutdown # v1.1 Change file permission of es-shutdown to user:group pi:pi kill $espid # v1.2 use kill@detected PID - easier to maintain now! exit fi
-
@cyperghost some notes
- the indentation can be improved :)
- the default
IFS
is space, tab and newline. I think there's no need to set it as space - I'm not getting the reason why you are messing with the
set
command (unnecessary complexity)...
the suggested command doesn't work for you?
pkill -f "$(sed -n 4p /dev/shm/runcommand.info)"
-
@meleu yes
pkill -f "$(sed -n 4p /dev/shm/runcommand.info)"
Does not work. So you need to extract just binary call... I tested with retroarch, glide64 and zdoom. All were prober working byset
-command -
@cyperghost said in Mausberry Shutdown Script Doesn't Save Metadata:
@meleu yes
pkill -f "$(sed -n 4p /dev/shm/runcommand.info)"
Does not work.weird. I'm not able to test on my actual RetroPie, but look the test I've made:
[PROMPT]$ sleep 1000 & [1] 8648 [PROMPT]$ cat test.info 1st line 2nd line 3rd line sleep 1000 bla bla bla [PROMPT]$ pkill -f "$(sed -n 4p test.info)" [1]+ Terminated sleep 1000
But I noticed an issue when the file to look for the 4th line doesn't exist... then my suggestion is to use this
[[ -f /dev/shm/runcommand.info ]] && pkill -f "$(sed -n 4p /dev/shm/runcommand.info)"
Can you test it on a real RetroPie setup?
-
@meleu Not now ... Have to work :)
Cya mate! -
@cyperghost I found the problem: that line from
runcommand.info
has some double quotes wich is confusing thepkill
. Here's my current solution:rcinfo=/dev/shm/runcommand.info [[ -f "$rcinfo" ]] && pkill -f -9 "$(sed -n 4p "$rcinfo" | cut -d' ' -f1)"
I tested on my retropie here and it seems to work. Please test it when you have a chance.
Cheers!
-
You guys are just talking gibberish again. For somebody who's unfamiliar with all of this, I'm completely lost. RetroPie is only my 2nd ever Pi project, and really only my first exposure to the scripting side of it. I'm eager to learn, but throwing out seemingly random lines of code without reference or instruction on where to place it doesn't help me any. :) No biggie, I'll get there. I'm just totally unfamiliar with the commands.
set
sed
,IFS
.. totally new to me. I only just learned abouttop
like 4 days ago. ^_^So tomorrow after work, would you rather I test @cyperghost's v1.4 or replace that section with @meleu's? Or would it be better to just wait and let ya'll hash it out some more?
-
@hansolo77 haha... sorry for the nerdy stuff. :)
my suggestion is to try this:
espid=$(pgrep -f "/opt/retropie/supplementary/.*/emulationstation([^.]|$)") if [ "$espid" ]; then [[ -f "/dev/shm/runcommand.info" ]] \ && pkill -f -9 "$(sed -n 4p "/dev/shm/runcommand.info" | cut -d' ' -f1)" \ && sleep 4 touch /tmp/es-shutdown && chown pi:pi /tmp/es-shutdown kill $espid fi
-
Ok cool. I'm going to bed soon so I will test this tomorrow when I get off work. If not right away, I'm off Thursday, so plenty of time then.
-
@meleu
You can even improve :)Edit
runcommand-onend.sh
and addsudo rm /dev/shm/runcommand.info
or make PR to runcommand.sh :)
Because runcommand.info isn't removed if emulator ends by start+select button :) It isn't really needed but it's a nice cleanup and definates the addition to the GPIO script you made with more sense. -
@cyperghost it can be useful for debugging. I prefer to keep it even after the emulator has finished.
-
@meleu And why do you check presence of runcommand.info in your script? Don't get me wrong but I think the filecheck only makes sense if you remove that after emulator call ends? Because you will always run the "sleep 4"-command even if you are only in ES :)
-
@cyperghost because if the file doesn't exist that
sed
will fail and print nothing (empty string).Just for fun do the following
- save all important file you have open.
- perform this command:
pkill -f ""
- cry (well, if you saved the files you don't have to cry. as I didn't saved, I cried)
Explaining: using an empty string as the pattern matches "everything". And the result is pkilling every single process owned by the pkiller!
I noticed it on an unpleasant way. :)
-
@meleu Okay ... what about this one?
It's pretty save and finds out PID of every emulator :)#!/bin/bash emucall=$(sed -n 4p /dev/shm/runcommand.info) emupid=${emucall#* } pos=$(expr ${#emucall} - ${#emupid}) emupid=$(pgrep -f ${emucall:0:$pos}) kill $emupid
Then if PID is a true value kill first the emulator and then kill ES in seconds instance... Thank your for every suggestions - I learn really a lot of your examples!
-
@cyperghost said in Mausberry Shutdown Script Doesn't Save Metadata:
@meleu Okay ... what about this one?
#!/bin/bash emucall=$(sed -n 4p /dev/shm/runcommand.info) emupid=${emucall#* } pos=$(expr ${#emucall} - ${#emupid}) emupid=$(pgrep -f ${emucall:0:$pos}) kill $emupid
Wow! It's a bit complex, isn't it?
Yeah, using parameter substitution is a good solution here. But I would simplify it with this:
emucall="$(sed -n 4p /dev/shm/runcommand.info)" [[ -n "$emucall" ]] && pkill -f "${emucall% *}"
By the way, sometimes I feel like we are messing @hansolo77 's thread with all those bash snippets. I'm going t open a bash thread for us. :-)
EDIT: topic created https://retropie.org.uk/forum/topic/11900/shell-scripting-topic
-
@meleu i think it's all relevant. I'm a mauseberry user as well and I find it interesting that I can make it finally function the way it needs to in a retropie setup. If we can get it to quit an emulator, save the sram And then save the meta data for emulation station, the better. I'm elated that my switch now saves meta data when in emulation station. I've had to redo scrapping so many times. 👍
-
Here here! Thanks @lostless :) I knew I wasn't alone in this. And yeah, you guys are just leaving me in the dust with all these snippets. I'd love to learn how to do all that on my own too, but until I do I have to rely on you guys coming up with solutions for me to test and try.
I hate to say, I have a migraine again tonight, so I'm not gonna be much help in troubleshooting a new method/addition. But I will try to do it tomorrow since I'm off work.
-
Correct me if I'm wrong, but it appears that the script monitoring the GPIO isn't debouncing the input. You would have to hold the button for up to a second depending on where in the sleep you hit it. This should cover debouncing and make it so you could require a hold of a specific length of time.
#GPIO init stuff here previous_power = 0 while [ 1 = 1 ]; do power=$(cat /sys/class/gpio/gpio$GPIOpin1/value) if [$power != $previous_power]; then sleep 0.05 #might need to be tweaked. You can make it 1s+ to require a hold power=$(cat /sys/class/gpio/gpio$GPIOpin1/value) if[$power != 0];then #shutdown code here fi fi previous_power = $power #you can put a short sleep here if need be done
-
@namerehwon I don't know the details about this GPIO thing, but I don't think that an infinite loop like that would be a good approach.
Maybe you can improve your script above using
inotify-tools
like in that script you saw on another thread.
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.