bash-skript för att kontrollera om program körs?
bash-skript för att kontrollera om program körs?
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?
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?
-
- Inlägg: 2157
- Blev medlem: 25 okt 2007, 14:00
- OS: Ubuntu
- Utgåva: 22.04 Jammy Jellyfish LTS
- Ort: Luleå
Re: bash-skript för att kontrollera om program körs?
borde väl annars fungera
Orkar inte kolla upp syntaxen men du kanske fattar ändå.
Kod: Markera allt
while true:
xbmc
spotify
Re: bash-skript för att kontrollera om program körs?
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.
- mcNisse
- Inlägg: 5211
- Blev medlem: 06 feb 2007, 20:51
- OS: Debian
- Utgåva: Vet inte/ingen utgåva passar
Re: bash-skript för att kontrollera om program körs?
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 $!
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
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ör att kontrollera att programmet körs kan du använda
Kod: Markera allt
ps -p $spotify_pid || {
xbmc&
exit
}
Re: bash-skript för att kontrollera om program körs?
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).
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?
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?
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?
Aha, då läste jag hans skript helt fel!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).

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.
- mcNisse
- Inlägg: 5211
- Blev medlem: 06 feb 2007, 20:51
- OS: Debian
- Utgåva: Vet inte/ingen utgåva passar
Re: bash-skript för att kontrollera om program körs?
En kompromiss är att skriva ett bash skript och anropa det från python.
Pythonskriptet blir inte större än så här
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')
- mcNisse
- Inlägg: 5211
- Blev medlem: 06 feb 2007, 20:51
- OS: Debian
- Utgåva: Vet inte/ingen utgåva passar
Re: bash-skript för att kontrollera om program körs?
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?
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?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)
- mcNisse
- Inlägg: 5211
- Blev medlem: 06 feb 2007, 20:51
- OS: Debian
- Utgåva: Vet inte/ingen utgåva passar
Re: bash-skript för att kontrollera om program körs?
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..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?
Re: bash-skript för att kontrollera om program körs?
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å.
KivIEs lösning i ett Python skript kanske är något att satsa på.
- Johnny Rosenberg
- Inlägg: 1256
- Blev medlem: 23 jun 2007, 16:18
- OS: Ubuntu
- Utgåva: 22.10 Kinetic Kudu
- Kontakt:
Re: bash-skript för att kontrollera om program körs?
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.
Men det är ju ändå inaktuellt nu, i och för sig.
Re: bash-skript för att kontrollera om program körs?
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.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.
- Johnny Rosenberg
- Inlägg: 1256
- Blev medlem: 23 jun 2007, 16:18
- OS: Ubuntu
- Utgåva: 22.10 Kinetic Kudu
- Kontakt:
Re: bash-skript för att kontrollera om program körs?
Jo, men skriptet såg ju inte ut att kunna överbelasta processorn heller direkt…m!rage skrev: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.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.
Re: bash-skript för att kontrollera om program körs?
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.Johnny Rosenberg skrev:Jo, men skriptet såg ju inte ut att kunna överbelasta processorn heller direkt…m!rage skrev: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.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.
- mcNisse
- Inlägg: 5211
- Blev medlem: 06 feb 2007, 20:51
- OS: Debian
- Utgåva: Vet inte/ingen utgåva passar
Re: bash-skript för att kontrollera om program körs?
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?
Även om loopen ser ut så här?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.
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?
Jag beskrev bara hur nice fungerar. Detta skriptet verkar dock ganska harmlöst om det bara uppdaterar en gång i sekunden.
- Johnny Rosenberg
- Inlägg: 1256
- Blev medlem: 23 jun 2007, 16:18
- OS: Ubuntu
- Utgåva: 22.10 Kinetic Kudu
- Kontakt:
Re: bash-skript för att kontrollera om program körs?
Jag tycker ju att den borde belasta, för den gör ju något precis hela tiden så fort den kan.ubot skrev:Även om loopen ser ut så här?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.
while true; do
echo "Hello World"
done
Även om loopen är jättesimpel men saknar sleep?
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.