[Debian] Perl script op achtergrond starten bij boot

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Frantic
  • Registratie: December 2005
  • Laatst online: 22:30
Ik heb een perl script wat een soort API is en fungeert als een proxy voor een applicatie.
Nu wil ik dit script starten bij het opstarten van het besturingssysteem (Debian).

Het commando wat ik nu handmatig intik om het script te starten is:

code:
1
perl /path/script.pl


Hierbij krijg ik allerlei gegevens in beeld te zien wanneer er een call op deze API plaats vindt. en kan ik alleen verdere commando's uitvoeren op het systeem als ik het script beeindig door middel van ctrl + c.
Om toch echter door te kunnen werken op de command line tik ik het volgende commando in:

code:
1
perl /path/script.pl&


Echter hierbij blijven er nog wel gegevens in beeld komen wanneer er een call gemaakt wordt.

Wat ik nu wil is dat het script volledig op de achtergrond draait, start wanneer het systeem start en bv te starten/stoppen is via
code:
1
/etc/init.d/script {start|stop|restart}


Ik heb via google rond gezocht en ben op het volgende script gestuit:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#!/bin/bash

PATH=/bin:/usr/bin:/sbin:/usr/sbin

case "$1" in

    start)
        echo -n "Starting"
        cd /path/script
        perl script.pl
    ;;

    stop)
        echo -n "Stopping"
        kill -9 `ps ax | grep "perl script.pl" | grep -v grep | awk '{ print $1 }'`
    ;;

    restart)
        $0 stop || true
        $0 start
    ;;

    *)
    echo "Usage: /etc/init.d/script {start|stop|restart}"
    exit 1
    ;;

esac

exit 0


Dit heb ik geprobeerd, maar niet aan de praat gekregen. Ik ben echter een complete leek op Unix gebied. Dus als iemand mij een schopje in de goeie richting kan geven: graag!

Acties:
  • 0 Henk 'm!

  • sander85
  • Registratie: Mei 2003
  • Laatst online: 06-10 17:52
Even wat kleine tips voor gebruik van linux.

Om een programma/script te draaien zonder te wachten op een eind type je een & achter je prgramma. In jouw geval dus:
code:
1
perl /path/script.pl &

Dit wist je zelf inmiddels al. Binnen linux kan je de uitvoer ook redirecten. Dit kan door het door te sturen naar /dev/null, een soort van zwart gat. Dit kan je doen op de volgende manier:
code:
1
perl /path/script.pl > /dev/null &

Hierbij wordt stdout doorgestuurd naar een soort van zwart gat, namelijk /dev/null. Nu kan het zijn dat er fouten optreden, die komen op het scherm via stderr. Deze kan je ook op zo'n zelfde manier wegwerken, en wel op deze:
code:
1
perl /path/script.pl 2>&1 > /dev/null &

Nu wordt zowel stdout als stderr doorgestuurt naar het zwarte gat /dev/null. Tevens zal dit op de achtergrond draaien door het &-teken.

Nu wil je het ook nog op laten starten. Het mooiste is inderdaad om er een script van te maken. Zo op het eerste oog ziet het script er goed uit. Wat is alleen de foutmelding die je krijgt wanneer je het init-script uitvoert? Is het een uitvoerbaar bestand? Het uitvoerbaar maken die je met het volgende commando:
code:
1
chmod +x /etc/init.d/script


Hiermee geef je rechten (voor iedereen!) om het script uit te mogen voeren.

Een andere mogelijkheid is om in /etc/rc.local (voor de exit, als die er staat) een regel neer te zetten waarin je script gestart wordt. Zorg er dan wel voor dat je hem op de achtergrond (dus met een &-teken) laat draaien, anders start je systeem niet meer op. Dit is wel een lelijkere manier want je kan het script dan niet anders stoppen behalve met een kill (wat je in feite ook in het init-script doet).

[ Voor 13% gewijzigd door sander85 op 08-07-2010 15:16 . Reden: rc.local mogelijkheid toegevoegd ]


Acties:
  • 0 Henk 'm!

  • Frantic
  • Registratie: December 2005
  • Laatst online: 22:30
Tnx, dat chmod had ik idd ook al uitgevoerd.

De error die ik krijg is:

code:
1
-bash: /etc/init.d/script: /bin/bash^M: bad interpreter: No such file or directory

[ Voor 15% gewijzigd door Frantic op 08-07-2010 15:17 ]


Acties:
  • 0 Henk 'm!

  • sander85
  • Registratie: Mei 2003
  • Laatst online: 06-10 17:52
Oke, je hebt het script in Windows gemaakt zo te zien. Klopt dat? Zou je dan eens het volgende willen doen?
code:
1
2
sudo apt-get install tofrodos
fromdos /etc/init.d/script


Ik draai zelf Ubuntu, die is gebaseerd op Debian. Ik weet niet of je sudo ook nodig hebt. Kan zijn dat je al als root draait. Met fromdos zet je een bestand om in een unix-formaat. Ik kan me herinneren dat het eventueel dos2unix zou kunnen heten. Zo was het in het verleden.

Je zou denken een tekstbestand is toch een tekstbestand. Dat is gedeeltelijk waar. Windows doet de indeling net iets anders dan te rest. UNIX/Linux gebruikt voor een nieuwe regel alleen 'line-feed', terwijl Windows daar nog een zogenaamde 'carier-return' meegeeft. Ik kan me zoiets herinneren van \n\r wat Windows doet, en linux doet enkel \n. (Correct me if I'm wrong...)

[ Voor 28% gewijzigd door sander85 op 08-07-2010 15:30 ]


Acties:
  • 0 Henk 'm!

  • Frantic
  • Registratie: December 2005
  • Laatst online: 22:30
Denk dat dit 'm idd gaat zijn haha, heb 'm inderdaad in windows gemaakt in een shared folder tussen de unix machine en de windows machine. En vanaf daar verplaatst.

Ik zal er eens naar kijken :) en kom er nog op terug!

Acties:
  • 0 Henk 'm!

  • Frantic
  • Registratie: December 2005
  • Laatst online: 22:30
OK, mooi het script in init.d werkt!

Echter blijft er nog wel output op m'n scherm komen.

Acties:
  • 0 Henk 'm!

  • sander85
  • Registratie: Mei 2003
  • Laatst online: 06-10 17:52
Vervang dan dit stukje uit het script:
code:
1
2
3
4
5
    start)
        echo -n "Starting"
        cd /path/script
        perl script.pl
    ;;

Door dit:
code:
1
2
3
4
5
    start)
        echo -n "Starting"
        cd /path/script
        perl script.pl > /dev/null 2>&1 &
    ;;

Dit is misschien nog wel mooier:
code:
1
2
3
4
    start)
        echo -n "Starting"
        perl /path/script/script.pl > /dev/null 2>&1 &
    ;;

Een editor in linux is bijvoorbeeld nano, of in een grafische omgeving gedit.

Acties:
  • 0 Henk 'm!

  • Frantic
  • Registratie: December 2005
  • Laatst online: 22:30
yes hij werkt :)

Ik had het volgende staan
code:
1
perl script.pl 2>&1 > /dev/null &


En dan gaat ie idd niet werken.

Acties:
  • 0 Henk 'm!

  • RvdH
  • Registratie: Juni 1999
  • Laatst online: 04-02 14:45

RvdH

Uitvinder van RickRAID

Wellicht is het handiger om je output ook te loggen, dat doe je door het aan te passen naar:
code:
1
perl /path/script/script.pl > /path/script/script.log 2>&1 &

Of als je alleen de foutmeldingen wilt loggen:

code:
1
perl /path/script/script.pl 2> /path/script/script.log 1> /dev/null &


Of je logt allebei in aparte files:

code:
1
perl /path/script/script.pl 2> /path/script/script.error_log 1> /path/script/script.log &


Of je toont de foutmeldingen op t scherm maar de rest log je:

code:
1
perl /path/script/script.pl 1> /path/script/script.log &


Je kan de output ook dmv het commando 'tee' laten loggen *en* op beeld tonen. :)

Acties:
  • 0 Henk 'm!

  • sander85
  • Registratie: Mei 2003
  • Laatst online: 06-10 17:52
Ik had het inderdaad verkeerd neergezet.
code:
1
perl script.pl 2>&1 > /dev/null &

Ik kwam er zelf ook later achter dat dit
code:
1
perl script.pl > /dev/null 2>&1 &
moest zijn.

Inderdaad kan je met tee op de volgende manier de uitvoer als het ware verdubbelen (middels pipen, dit doe je met een teken "|" ):
code:
1
perl /path/script/script.pl | tee /path/script/script.log

Nu wordt de uitvoer van het script op het scherm getoond en naar het log-bestand gestuurd. Als je ook de errors wilt sturen naar het logbestand is de volgende regel nodig:
code:
1
perl /path/script/script.pl 2>&1 | tee /path/script/script.log

Als je alleen de errors op het scherm wilt en deze wilt loggen zal je het volgende moeten doen:
code:
1
perl /path/script/script.pl > /dev/null | tee /path/script/script.log

Is hier eigenlijk ergens niet een tutorial voor? Het zijn best zinnige onderwerpen voor een beginnende linux-expert ;).

Ik heb wel wat gevonden:

Acties:
  • 0 Henk 'm!

  • Gertjan
  • Registratie: Oktober 2001
  • Laatst online: 09-09 17:11

Gertjan

mmmm, beer...

Kijk voor je init-script even naar de tool start-stop-daemon. Die kan alles wat jij wilt.

Acties:
  • 0 Henk 'm!

  • Rainmaker
  • Registratie: Augustus 2000
  • Laatst online: 14-07-2024

Rainmaker

RHCDS

Voor redirecten van de output is het trouwens een stuk netter om >> of tee -a te gebruiken.

Anders wordt bij een restart van de "applicatie" de logfile leeggemaakt, wat niet handig is voor debuggen *waarom* het ding chrashte.

Verder kun je bovenaan je perl script ook
code:
1
#!/bin/perl


zetten. Dan hoef je niet
code:
1
perl script.pl

te gebruiken, maar alleen
code:
1
./script.pl

We are pentium of borg. Division is futile. You will be approximated.

Pagina: 1