Sida 1 av 2
bash-skript för att kontrollera om program körs?
Postat: 07 nov 2010, 14:02
av ubot
Jag har planer på att köra Spotify (gratisversionen) parallellt med XBMC. Jag har tänkt att ha ett skript som från XBMC stänger ner XBMC och istället öppnar Spotify (på Ubuntus vanliga Skrivbord). När jag sedan stänger Spotify så vill jag att XBMC ska öppnas igen. Finns det något smart sätt att lösa det här på?
En idé jag har är att låta ett bash-skript hela tiden kontrollera om Spotify körs och om det inte gör det (och om inte XBMC redan är igång) så ska skriptet starta XBMC. Det kanske finns smartare sätt att lösa det här på?
Jag vet att det finns stöd för Spotify Premium i XBMC, men nu snackar vi alltså om att växla mellan Spotify (gratisversionen) och XBMC.
Jag är inne på den här lösningen ...
xbmc_pid=$(ps -C xbmc.bin -o pid= | grep -o "[[:digit:]]*")
kill $xbmc_pid
wine "C:\Program Files\Spotify\spotify.exe" &
while true; do
spotify_pid=$(ps -C spotify.exe -o pid= | grep -o "[[:digit:]]*")
if [[ ! -z "$spotify_pid" ]]; then
kill $spotify_pid
xbmc &
exit
fi
sleep 1
done
Det känns som om while-loopen kommer köra slut på processorn. Eller är det inga problem att ha ett skript som ligger och kolla ps en gång/sekund?
Re: bash-skript för att kontrollera om program körs?
Postat: 07 nov 2010, 16:29
av KiviE
borde väl annars fungera
Orkar inte kolla upp syntaxen men du kanske fattar ändå.
Re: bash-skript för att kontrollera om program körs?
Postat: 07 nov 2010, 16:57
av ubot
Jag tror mitt skript fungerar. Problemet är nu att XBMC helst vill ha Python-skript om jag inte är helt ute och cyklar och jag har ju ett bash-skript. Finns det något smidigt sätt att köra ett bash-skript inne i XBMC? Jag vill alltså kunna starta bash-skriptet utan att behöva lämna XBMC.
Re: bash-skript för att kontrollera om program körs?
Postat: 07 nov 2010, 21:03
av mcNisse
Om du ska starta programmet från xbmc så får du se till att du inte dödar skriptet själv när du tar ner xmbc. I ett c-program skulle du forka och anropa setsid.
Ett bash-skript kan anropas med
nohup skript&
Men du kanske vill anropa ditt skript från python. Då kan du forka och sedan anropa setsid och skrptet i barnprocessen.
Några tips till skiptet
använd
pgrep för att ta reda på pid.
När du startar ett program med & får du barnprocessens pid i variabeln
$!
Kod: Markera allt
wine "C:\Program Files\Spotify\spotify.exe" &
spotify_pid=$1
Förutsatt att wine beter sig som normala program. Har inte använt wine själv...
för att kontrollera att programmet körs kan du använda
Re: bash-skript för att kontrollera om program körs?
Postat: 07 nov 2010, 21:07
av m!rage
Nej men kolla på Kivies skript nu, det verkar skitsmart. Du kör skriptet för att starta xbmc. När xbmc avslutas startas spotify. När spotify avslutas börjar slingan om och startar xbmc igen och så vidare...
Sen uppstår ju ett problem när man vill stänga av datorn så då får man väl döda skriptet med ctrl-c om man inte hittar något finurligt sätt att fånga upp dbus-signalen för avstängning (typ).
Re: bash-skript för att kontrollera om program körs?
Postat: 07 nov 2010, 21:09
av ubot
Ok, tackar för tipsen!
Jag har framförallt två frågor nu som jag inte förstår hur jag ska lösa:
1. Är det ett problem att 1 gång/sekund köra kommandot ps och sedan if-satsen om och om igen? Jag menar "sliter" det onödigt mycket på processorn? Tar det för mycket resurser eller något att loopa en sådan funktion så ofta?
2. Jag försöker exekvera bash-skriptet genom att bina en keyboard shortcut till skriptet men det verkar som om XBMC på något sätt stänger av tangentbordsgenvägarna i Ubuntu när man kör XBMC i fullscreen? Hur ska jag göra för att köra ett bash-skript i XBMC?
Re: bash-skript för att kontrollera om program körs?
Postat: 07 nov 2010, 21:10
av ubot
m!rage skrev:Nej men kolla på Kivies skript nu, det verkar skitsmart. Du kör skriptet för att starta xbmc. När xbmc avslutas startas spotify. När spotify avslutas börjar slingan om och startar xbmc igen och så vidare...
Sen uppstår ju ett problem när man vill stänga av datorn så då får man väl döda skriptet med ctrl-c om man inte hittar något finurligt sätt att fånga upp dbus-signalen för avstängning (typ).
Aha, då läste jag hans skript helt fel!
Ja, det är ju klart. Skriptet gör halt i väntan på att XBMC ska avslutas osv. Det är ju inte hela världen när man ska stänga av datorn för om man i Ubuntu eller XBMC stänger av datorn så antar jag att Spotify eller XBMC inte hindrar avstängning av systemet även om skriptet går. Det brukar ju inte öppna program gör normalt ju.
Ett problem är att skriptet inte startas från en Spotify-meny i XBMC. Det har jag gärna sett. Ett menyalternativ i XBMC som startar Spotify genom att först stänga ner XBMC och tvärtom. KivIE funktion kräver ju att man sätnger ner XBMC manuellt för att öppna Spotify.
Jag kanske borde gå över till Python eftersom XBMC har stöd för Python-skript. Problemet är att jag inte vet hur man gör sådana här saker i Python. T.ex. stänger ett program (kill) eller kontrollerar processid (ps) osv.
Re: bash-skript för att kontrollera om program körs?
Postat: 07 nov 2010, 21:43
av mcNisse
En kompromiss är att skriva ett bash skript och anropa det från python.
Pythonskriptet blir inte större än så här
Kod: Markera allt
#!/usr/bin/python
import os
os.system('hela sökvägen till ditt bash skript')
Re: bash-skript för att kontrollera om program körs?
Postat: 07 nov 2010, 21:48
av mcNisse
fast om du ända skriver det i python så kan du äver göra forken
Kod: Markera allt
import os
pid=os.fork()
if pid == 0:
#barn processen
os.setsid()
os.system(blablabla)
Re: bash-skript för att kontrollera om program körs?
Postat: 07 nov 2010, 22:49
av ubot
mcNisse skrev:fast om du ända skriver det i python så kan du äver göra forken
Kod: Markera allt
import os
pid=os.fork()
if pid == 0:
#barn processen
os.setsid()
os.system(blablabla)
Jag är inte riktigt med i svängarna när det kommer till det här med forken. Jag tror det duger fint att starta mitt bash-skript från Python-skriptet. Jag antar att jag behöver forka för att bash-skriptet inte ska dö med XBMC?
Re: bash-skript för att kontrollera om program körs?
Postat: 07 nov 2010, 22:52
av mcNisse
ubot skrev:Jag är inte riktigt med i svängarna när det kommer till det här med forken. Jag tror det duger fint att starta mitt bash-skript från Python-skriptet. Jag antar att jag behöver forka för att bash-skriptet inte ska dö med XBMC?
Det stämmer bra. När föräldraprocesen dör försvinner alla program som den är förälder till. Därför krävs en fork och en setsid..
Re: bash-skript för att kontrollera om program körs?
Postat: 07 nov 2010, 22:59
av ubot
Ok. Jag antar att det blir snyggare att skriva allt i Python. Även söka upp PID, kontrollera om programmet körs, ev. stoppa programmet med kill osv. Jag får se om jag orkar skriva om mitt bash-skript till Python.
KivIEs lösning i ett Python skript kanske är något att satsa på.
Re: bash-skript för att kontrollera om program körs?
Postat: 10 nov 2010, 21:06
av Johnny Rosenberg
Apropå frågan om ett skript ”sliter på processorn”, så kan man väl alltid köra ett skript med ”nice”, eller?
Men det är ju ändå inaktuellt nu, i och för sig.
Re: bash-skript för att kontrollera om program körs?
Postat: 10 nov 2010, 22:42
av m!rage
Johnny Rosenberg skrev:Apropå frågan om ett skript ”sliter på processorn”, så kan man väl alltid köra ett skript med ”nice”, eller?
Men det är ju ändå inaktuellt nu, i och för sig.
Att göra det mer nice sänker bara prioriteten, men det kan fortfarande använda så mycket processortid det vill, om ingen annan process är spekulant på cpu-cyklerna för tillfället.
Re: bash-skript för att kontrollera om program körs?
Postat: 10 nov 2010, 23:34
av Johnny Rosenberg
m!rage skrev:Johnny Rosenberg skrev:Apropå frågan om ett skript ”sliter på processorn”, så kan man väl alltid köra ett skript med ”nice”, eller?
Men det är ju ändå inaktuellt nu, i och för sig.
Att göra det mer nice sänker bara prioriteten, men det kan fortfarande använda så mycket processortid det vill, om ingen annan process är spekulant på cpu-cyklerna för tillfället.
Jo, men skriptet såg ju inte ut att kunna överbelasta processorn heller direkt…
Re: bash-skript för att kontrollera om program körs?
Postat: 11 nov 2010, 08:33
av ubot
Johnny Rosenberg skrev:m!rage skrev:Johnny Rosenberg skrev:Apropå frågan om ett skript ”sliter på processorn”, så kan man väl alltid köra ett skript med ”nice”, eller?
Men det är ju ändå inaktuellt nu, i och för sig.
Att göra det mer nice sänker bara prioriteten, men det kan fortfarande använda så mycket processortid det vill, om ingen annan process är spekulant på cpu-cyklerna för tillfället.
Jo, men skriptet såg ju inte ut att kunna överbelasta processorn heller direkt…
Rätta mig om jag har fel, men loopen i sig belastar i princip inte processorn utan det är innehållet i en loop som står för belastningen? Jag har haft en känsla av att själva loopandet while true tynger en dator eftersom skriptet hela tiden körs utan att bli klart.
Re: bash-skript för att kontrollera om program körs?
Postat: 11 nov 2010, 11:39
av mcNisse
Det belastar inget om du har en sleep i den. Går loopen i spin och kör som en tok så är läget helt annorlunda.
Re: bash-skript för att kontrollera om program körs?
Postat: 11 nov 2010, 18:39
av ubot
mcNisse skrev:Det belastar inget om du har en sleep i den. Går loopen i spin och kör som en tok så är läget helt annorlunda.
Även om loopen ser ut så här?
while true; do
echo "Hello World"
done
Även om loopen är jättesimpel men saknar sleep?
Re: bash-skript för att kontrollera om program körs?
Postat: 11 nov 2010, 18:55
av m!rage
Jag beskrev bara hur nice fungerar. Detta skriptet verkar dock ganska harmlöst om det bara uppdaterar en gång i sekunden.
Re: bash-skript för att kontrollera om program körs?
Postat: 11 nov 2010, 18:59
av Johnny Rosenberg
ubot skrev:mcNisse skrev:Det belastar inget om du har en sleep i den. Går loopen i spin och kör som en tok så är läget helt annorlunda.
Även om loopen ser ut så här?
while true; do
echo "Hello World"
done
Även om loopen är jättesimpel men saknar sleep?
Jag tycker ju att den borde belasta, för den gör ju något precis hela tiden så fort den kan.
Men enklast är ju att testa. Öppna systemövervakaren och kolla CPU-kurvan. Kör skriptet och se om det händer något drastiskt.
Testade just själv och nog gick kurvan i topp alltid.