Kirjoittaja Aihe: "start-stop-daemon" ei tunnista jo käynnissä olevaa diimonia ? [Ratkaistu]  (Luettu 1895 kertaa)

ajaaskel

  • Palvelimen ylläpitäjä
  • Käyttäjä
  • Viestejä: 3401
    • Profiili
(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:

Koodia: [Valitse]
ls -l /var/run/au*.pid
-rw-r--r-- 1 root root 6 heinä 24 14:39 /var/run/auto_dld.pid

Koodia: [Valitse]
pgrep -l auto_19878 auto_dld

eli käynnissä on "auto_dld"

Koodia: [Valitse]
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ä:

Koodia: [Valitse]
#!/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.)

  
« Viimeksi muokattu: 26.07.12 - klo:10.36 kirjoittanut ajaaskel »
Autamme ilolla ja ilmaiseksi omalla ajallamme.  Ethän vaadi, uhoa tai isottele näin saamasi palvelun johdosta.

Tommi S.

  • Käyttäjä
  • Viestejä: 240
    • Profiili
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ä:

Koodia: [Valitse]
#!/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:
Koodia: [Valitse]
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:
Koodia: [Valitse]
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:
Koodia: [Valitse]
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ä.
« Viimeksi muokattu: 25.07.12 - klo:17.29 kirjoittanut Tommi S. »

ajaaskel

  • Palvelimen ylläpitäjä
  • Käyttäjä
  • Viestejä: 3401
    • Profiili
Mielenkiintoista, täytyypä kokeilla tuota ssd: tä huomenna vielä uudestaan kun ehdin jo itse kirjoitella ssd: n korvaajan.


Edit 26.7.12

Koodia: [Valitse]
sudo service autodld status * auto_dld is running

Koodia: [Valitse]
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ä.    
« Viimeksi muokattu: 26.07.12 - klo:10.59 kirjoittanut ajaaskel »
Autamme ilolla ja ilmaiseksi omalla ajallamme.  Ethän vaadi, uhoa tai isottele näin saamasi palvelun johdosta.