Ubuntu Suomen keskustelualueet
Ubuntun käyttö => Ohjelmointi, palvelimet ja muu edistyneempi käyttö => Aiheen aloitti: ajaaskel - 24.07.12 - klo:17.06
-
(Ohjelmoinnista kiinnostuneille)
start-stop-daemon (ssd) aiheutti pienen yllätyksen kun rakentelen Sys-V käynnistykselle skriptiä. En ole varma onko tämä ominaisuus, bugi, väärinymmärrys tai jotain muuta --- arvaan aluksi että jotain on jäänyt huomaamatta.
Hakemistossa /var/run on pid-loppuisia tiedostoja. Olen arponut noille tarkoitukseksi dokumentaatiota tulkiten että nuo ovat lukkotiedostoja eli jos tuolla on nimi mukana niin samaa ohjelmaa ei pitäisi (?) enää saada käyntiin toista kertaa (eli uutena "instanssina"). Kokeessani käynnistyksessä ssd ei kuitenkaan välitä pid-tiedoston olemassaolosta, sammutusvaiheessa sen sijaan se tarkastaa tuon olemassaolon.
Esimerkki kertoo tuon parhaiten:
ls -l /var/run/au*.pid
-rw-r--r-- 1 root root 6 heinä 24 14:39 /var/run/auto_dld.pid
pgrep -l auto_19878 auto_dld
eli käynnissä on "auto_dld"
sudo start-stop-daemon --start --pidfile /var/run/auto_dld.pid --exec /usr/local/bin/auto_dld --testWould start /usr/local/bin/auto_dld
Silti ssd haluaisi startata "auto_dld": n vaikka se on jo käynnissä.
Edit: Saatan olla jäljillä, näyttää hieman että ssd tunnistaa vain käännetyn koodin, ei tulkattavaa. Teinpä kokeeksi ikuisen silmukan joka ajaa "nop" -käskyä:
#!/bin/bash
while :
do
:
done
Tallensin tuon "ikuinen" -nimelle ja ajoin, ei tunnistu tuo eli vahvistaisi epäilystäni. (Sivuvaikutuksena tuo myös kuormittaa reilusti.)
-
Edit: Saatan olla jäljillä, näyttää hieman että ssd tunnistaa vain käännetyn koodin, ei tulkattavaa. Teinpä kokeeksi ikuisen silmukan joka ajaa "nop" -käskyä:
#!/bin/bash
while :
do
:
done
Joo, tutkin hieman tuon start-stop-daemonin manuaalisivua, ja näyttää siltä että olet todellakin oikeilla jäljillä.
Tein itselleni myös samanlaisen bash-skriptin joka ei tee mitään (paitsi että minun skriptini tekee silmukassa sleep komennon jotta ei turhaan käytetä suoritinta), ja laitoin sen pyörimään. Minun skriptini sai prosessinumeron 2982.
Ssd:n manuaalissa sanotaan tuosta --exec valitsimesta näin:
-x, --exec executable
Check for processes that are instances of this executable
(according to /proc/pid/exe).
Eli se katsoo tuonne /proc/2982/exe tiedostoon ja katsoo mikä siellä pyörii. Nyt jos ls komennolla katsotaan mitä sieltä löytyy niin nähdään seuraavaa:
tommi@tommi-desktop64:~$ ls -l /proc/2982/exe
lrwxrwxrwx 1 tommi tommi 0 heinä 25 17:11 /proc/2982/exe -> /bin/bash
Eli se onkin /bin/bash joka siellä pyörii, eikä ohjelma nimeltä testi.sh jonka olin luonut.
Mutta — ssd:n manuaalisivua tutkimalla huomaamme että on toinenkin valitsin:
-n, --name process-name
Check for processes with the name process-name (according to
/proc/pid/stat).
Tämä name valitsin siis katsoo /proc/2982/stat tiedostoa, ja jos katsomme mitä sieltä löytyy niin löydämme seuraavaa:
tommi@tommi-desktop64:~$ cat /proc/2982/stat
2982 (testi.sh) S 2822 2982 2822 34816 3404 4202496 5539 58106 0 0 4 20 2 13 20 0 1 0 128248 13873152 341 18446744073709551615 4194304 5110396 140736121151904 140736121150080 140725522402366 0 65536 4 65538 18446744071579283524 0 0 17 0 0 0 0 0 0
Sieltä siis löytyy tuo testi.sh joka on ohjelmani nimi.
Näiden tutkimusten perusteella vaikuttaisi siis siltä että oikea komento tuolle start-stop-daemonille olisi suunnilleen seuraavanlainen:
sudo start-stop-daemon --start --startas /usr/local/bin/auto_dld --pidfile /var/run/auto_dld.pid --name auto_dld --test
Eli --exec valitsimen sijaan käytetään --startas valitsinta kertomaan mikä komento suoritetaan, ja --name valitsinta kertomaan mikä nimi ohjelmalla on kun se on käynnissä.
-
Mielenkiintoista, täytyypä kokeilla tuota ssd: tä huomenna vielä uudestaan kun ehdin jo itse kirjoitella ssd: n korvaajan.
Edit 26.7.12
sudo service autodld status * auto_dld is running
sudo start-stop-daemon --start --startas /usr/local/bin/auto_dld --pidfile /var/run/auto_dld.pid --name auto_dld --testprocess already running.
Joo, toimii oikein tuolla tavalla. Tuopa helpottaa tulkattavien kielien käyttäjiä jatkossa ellei halua itse kirjoitella vastaavaa koodia, kiitos !
PS. Netissä näyttäisi olevan sekalaista ja harhaanjohtavaakin juttua mitä tarvitaan kun kirjoittaa diimonin eli taustalla pyörivän ohjelman. Jotkut ovat varmoja että "se pitää tehdä C: llä". Oma havaintoni on että käytetyllä kielellä ei ole merkitystä niin kauan kun kielestä/apuohjelmista löytyy keino mennä taustalle ja päästä eroon päätteestä.