Mausberry Shutdown Script Doesn't Save Metadata
-
I rearranged the script a bit
It was written down just for testing purposes - so I made some small improvments that should be better for future maintainment. In v1 and v1.1 you have to change two lines in PID detection. Now I always use the detected PID. I removed echos and the useless else branch.@hansolo77 version 1.2 is ready for you
#!/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 # 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 sudo poweroff fi done
-
I will try version 1.2 in a little bit. I'm slowly getting familiar with reading scripts and understanding how they work. The various keys and commands I'm totally lost on so I'd need a lot more experience with them to be able to write my own. In the meanwhile, I noticed you changed from
pkill
to justkill
. You sure that will work too? But like I said, will test.As for testing the games... I've actually played a few games and seen the
Last Played
collection have them, only to have it not save that list. I think in all experience so far, the only time it's not saving is from a crash. I will try playing a game, exit to ES, verify the game is listed, then play something else and shut down while playing to see if the previous game remains. -
@hansolo77
My last posting for today!There goes my mind!
Yes I changed from pkill to kill because it's the standard application to terminate processes, but it's working only if you got the PID. The PID is an unique number for every process given bei the OS. I've extracted the PID already with thepgrep
command so there is no need to usepkill
and let it search for regualar expressions which hit ES's binary.Kill
PID is enough and leaves small footprint.Some people would call it narrow-minded but I think when someone asks for help then do it at your best stage, this gives you the opportunity in development. The else branch was indeed waste of space - useless and I introduced it only for the quick falling distinctive between the if clause as I made first attempts with this.
If you are satisfied with this script you can mark it as solved.
-
v1.2 of the script is working just as well as the previous one was. Thanks!
@pjft - I played a game, verified it recorded it in
Last Played
then started another game and shutdown with it still running. It did NOT save theLast Played
at that point, and the 1st game was no longer on the list. I know where you were going with this, thinking it should have saved the gamelist.xml upon returning to ES, so I purposely loaded the 2nd game from a different system. It made no difference. Seems like it only saves the gamelists when completely exiting ES, and simply does a temporary save until then. So this problem will actually effect everybody, not just people using the Mausberry. Now that I know how it works, and can see what's happening, I'm happy with just using the new script. Will just have to wait until something new comes along, unless you have other testing you'd like me to try. -
@hansolo77 I assume, though, that what you're experiencing is that the gamelist file's date also isn't updated, though, could you confirm?
It only saves the actual gamelists when completely exiting ES, that is correct, what I was hoping was that it was saving it, but just not recording the last game as it hadn't yet even updated it.
-
@pjft @hansolo77
There might be a way but please do it on your own. Because that are dirty tricks....And this should not the intention here in this forum nor will I write a script for this becasue it does not work 100% for all usecases. To make it work to 100% there will be much maintaining in and I think version 1.2 is the one that should be used ...
Shotgun method:
# 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.3 07/24/17 - Shotgun method to terminate retroarch (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 # Condition: PID is not equal 0 or empty then use ES shutdown pkill retroarch > /dev/null 2>&1 # v1.3 Shotgun method to kill running emulator (untested sleep 2 # v1.3 Sleeptimer to give ES chance to save XML filestate (untestested) 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 (Shotgun-version - no support!)
This will end any retroarch emulator (I think Ports, advMAME, fba... and other non librettro cores won't work). Therefore I will not maintain this. After retroarch is killed by default it waits 2 seconds for ES shutdown. Then it may happen that ES updates the XML files and you will see your alst played games. Maybe it won't work, maybe you must set sleeptime higher. I can not tell you if there are any other sideeffects.
-
@cyperghost thanks.
Just to confirm, I don't expect this to be in any way to be encouraged. I'm looking at this more as an angle on how to help @hansolo77 's use case.
Best.
-
@cyperghost @pjft
Hey guys, I didn't read what you guys already tried, sorry. But I'm afraid it's not possible to get the results expected in the OP by killing ES. As far as I understood this part of ES code must be executed to update the gamelists: https://github.com/retropie/EmulationStation/blob/master/es-app/src/SystemData.cpp#L51I'm not used to ES code (maybe @pjft can help with this), but I think that that line won't be executed by killing ES while an emulator is running.
-
@pjft I see it as encourgement that @hansolo77 got now his toolbox to write a script that is intented for his usecase. All commands are given in this sniplet. If this will work?? I don't know.
From first version up to 1.2 - I was 100% sure that this works. And this works for every user here in the forum... Any other method is simply try and error.
-
@meleu Hi mate :)
No problem. We know that a proper exit via pkill/kill works(remember this thread my friend?) . @hansolo77 confirmed this. It won't work if the emulator is running. So my shotgun method is to always kill emulator (retroarch) wait 2-3 seconds and then it may work becasue ES can write XML data. But I think version 1.2 of the script posted here works for all users out here. So this version should be maintained.
-
@cyperghost ha! good catch! can I give a suggestion?
your script only works properly if the user is running retroarch. I believe you can kill any
emulatorprogram launched by runcommand using this (please, test it before using!!):pkill -f "$(sed -n 4p /dev/shm/runcommand.info)"
Note: the 4th line of
runcommand.info
has the exact command line launched by runcommand, as you can see in this line of runcommand.sh code. -
Yes I kill only retroarch ... but I'm not sure if this is enough. If your script can find out all running emulators then the usecase works for all. But I haven't tested out now if killing emulator ... waiting 2 seconds ... hoping that ES writes XML file ... does work.
I think that's @hansolo77 job and then it would nice not to always kill the emulator process (=shotgun method) rather if it running, so you need a new if-then branch or make use of case selection. But I believe that is not our job :)
But you know I really appreciate your help, always!
-
@cyperghost said in Mausberry Shutdown Script Doesn't Save Metadata:
If your script can find out all running emulators
AFAIK EmulationStation isn't able to launch more than one emulator. You must exit the emulator, then go back to ES and then launch another emulator. Then killing the command that stays in the 4th line of
/dev/shm/runcommand.info
looks like a good approach for me. -
That will work. Indeed ....
inruncommand.info
is everything stored but not if an emulator is currently running or not.
I wouldratheruseruncommand.log
runcommand.info
, too4th line /opt/retropie/emulators/retroarch/bin/retroarch -L /opt/retropie/libretrocores/lr-fceumm/fceumm_libretro.so --confi....
and check
pgrep /opt/retropie/emulators/retroarch/bin/retroarch
for ex. if PID > 0
if yes, then an emulator seems to be running if PID empty or 0 then there is no emulator.So it is surly possible to detect every emulator-run proper initiated by
runcommand.sh
Thank you
@hansolo77 got his toolbox now ;) He should use it :)
-
@cyperghost Wow! You really confused me! PID > 0? Also, why are you so obsessed in killing retroarch? Is it your next victim after you killed EmulationStation so many times like it was Kenny (Sourth Park)? :)
If you
pkill
an inexistent process it doesn't hurt anything, then IMHO there's no need to check if that command is still running.[PROMPT]$ pkill -f blablabla [PROMPT]$ # see? nothing happens! :)
-
PID > 0 means it is running or not ;)
Okay than the approach is easy if pkill does not hurt :)pkill -f "$(sed -n 4p /dev/shm/runcommand.info)"
@hansolo77? There is a new toy ;)
Please instead ofpkill retroarch
use line above. Can you please test?
If all proper runs it can be pushed to version 1.3ES is not a victim, it behaves like a sqarehead but with a few tricks it can be calmed down ;)
Knowledge is power and thank you @meleu to share your knowledge with us.I think thats our passion not obsession, that would be bad!
-
Wow guys. My email inbox is spammed. :) I'm actually not too worried about getting it to save if I'm in the middle of a game. That situation rarely comes up, and to my memory only recently while troubleshooting all this. :)
I will test v1.3 (adding the retroarch pkill) here in a little while. I'm suffering a massive migraine. Have had it the last 3 days. Every now and then it act's like it's feeling a little better and I can get some work done with this. I'm honestly thrilled that I've got you guys pulling your hair out on all this and have a working solution already. :)
-
@hansolo77 said in Mausberry Shutdown Script Doesn't Save Metadata:
I'm honestly thrilled that I've got you guys pulling your hair out
Which hair? :-)
-
@hansolo77 Please test like you want
pkill retroarch
works just for libretro-cores, the sniplet of @meleu works with all things that were started throughruncommand.sh
- so it's the more versatile wayWhich hair :-)
nose hair! What an awful torture!
-
The 1.2 script is working great for me as well.
@hansolo77 I've solved the saving issue by having retroarch to check and write to disk the srm files every 10 seconds if its new. Its an option in retroarch under the saving menu. I learned a hard lesson powering off in the middle of a game and losing about an hours worth of gameplay.
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.