bash-skript för att kontrollera om program körs?

Här diskuterar vi skal, kommandon och klassiska linuxverktyg.
ubot
Inlägg: 4613
Blev medlem: 04 jan 2008, 14:03
OS: Ubuntu
Utgåva: 24.04 Noble Numbat LTS

bash-skript för att kontrollera om program körs?

Inlägg 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?
KiviE
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?

Inlägg av KiviE »

borde väl annars fungera

Kod: Markera allt

while true:
xbmc
spotify
Orkar inte kolla upp syntaxen men du kanske fattar ändå.
ubot
Inlägg: 4613
Blev medlem: 04 jan 2008, 14:03
OS: Ubuntu
Utgåva: 24.04 Noble Numbat LTS

Re: bash-skript för att kontrollera om program körs?

Inlägg 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.
Användarvisningsbild
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?

Inlägg 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

Kod: Markera allt

ps -p $spotify_pid || {
xbmc& 
exit
}
m!rage
Inlägg: 2550
Blev medlem: 28 apr 2009, 21:47
OS: Arch Linux
Ort: Lund

Re: bash-skript för att kontrollera om program körs?

Inlägg 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).
ubot
Inlägg: 4613
Blev medlem: 04 jan 2008, 14:03
OS: Ubuntu
Utgåva: 24.04 Noble Numbat LTS

Re: bash-skript för att kontrollera om program körs?

Inlägg 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?
ubot
Inlägg: 4613
Blev medlem: 04 jan 2008, 14:03
OS: Ubuntu
Utgåva: 24.04 Noble Numbat LTS

Re: bash-skript för att kontrollera om program körs?

Inlägg 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.
Användarvisningsbild
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?

Inlägg 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')
Användarvisningsbild
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?

Inlägg 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)
ubot
Inlägg: 4613
Blev medlem: 04 jan 2008, 14:03
OS: Ubuntu
Utgåva: 24.04 Noble Numbat LTS

Re: bash-skript för att kontrollera om program körs?

Inlägg 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?
Användarvisningsbild
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?

Inlägg 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..
ubot
Inlägg: 4613
Blev medlem: 04 jan 2008, 14:03
OS: Ubuntu
Utgåva: 24.04 Noble Numbat LTS

Re: bash-skript för att kontrollera om program körs?

Inlägg 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å.
Användarvisningsbild
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?

Inlägg 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.
Vänliga hälsningar

Johnny Rosenberg
ジョニー・ローゼンバーグ

IEEE 1541 - binära prefix
ISO 8601 - datum och tid
m!rage
Inlägg: 2550
Blev medlem: 28 apr 2009, 21:47
OS: Arch Linux
Ort: Lund

Re: bash-skript för att kontrollera om program körs?

Inlägg 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.
Användarvisningsbild
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?

Inlägg 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…
Vänliga hälsningar

Johnny Rosenberg
ジョニー・ローゼンバーグ

IEEE 1541 - binära prefix
ISO 8601 - datum och tid
ubot
Inlägg: 4613
Blev medlem: 04 jan 2008, 14:03
OS: Ubuntu
Utgåva: 24.04 Noble Numbat LTS

Re: bash-skript för att kontrollera om program körs?

Inlägg 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.
Användarvisningsbild
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?

Inlägg 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.
ubot
Inlägg: 4613
Blev medlem: 04 jan 2008, 14:03
OS: Ubuntu
Utgåva: 24.04 Noble Numbat LTS

Re: bash-skript för att kontrollera om program körs?

Inlägg 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?
m!rage
Inlägg: 2550
Blev medlem: 28 apr 2009, 21:47
OS: Arch Linux
Ort: Lund

Re: bash-skript för att kontrollera om program körs?

Inlägg 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.
Användarvisningsbild
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?

Inlägg 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.
Vänliga hälsningar

Johnny Rosenberg
ジョニー・ローゼンバーグ

IEEE 1541 - binära prefix
ISO 8601 - datum och tid
Skriv svar

Återgå till "Terminalforum"