Op deze website gebruiken we cookies om content en advertenties te personaliseren, om functies voor social media te bieden en om ons websiteverkeer te analyseren. Ook delen we informatie over uw gebruik van onze site met onze partners voor social media, adverteren en analyse. Deze partners kunnen deze gegevens combineren met andere informatie die u aan ze heeft verstrekt of die ze hebben verzameld op basis van uw gebruik van hun services. Meer informatie.

Akkoord

Vraag & Antwoord

OS Linux

Het beeingigen van een proces in een init script

dJeedJee
7 antwoorden
  • Ik heb een aantal eigen init-scripts gemaakt. Maar nu bij stoppen de processen niet als ik het scritpdcommando stop geef. Wat heb ik mis gedaan?

    <begin>
    #! /bin/bash
    #
    # /etc/icecast
    #

    . etc/init.d/functions

    case "$1" in
    start)
    echo "Starting Webmail server"
    /usr/lib/webmail-0.7.6/bin/webmail.sh </dev/null >/dev/null 2>&1 &
    ;;
    stop)
    echo "Shutting Webmail server"
    kill /usr/lib/webmail-0.7.6/bin/webmail.sh
    echo
    ;;
    *)
    echo "Usage: $0 {start|stop}"
    exit 1
    esac

    exit 0
    <end>
  • >kill /usr/lib/webmail-0.7.6/bin/webmail.sh

    Dit is niet de manier volgens mij….
  • M.a.w. Je kunt geen programma 'killen' maar alleen proces-id's.

    Zie bijvoorbeeld onderstaand script dat yes kan starten en stoppen:

    #!/bin/ksh
    case "$1" in
    start)
    echo "Starting yes"
    yes
    ;;
    stop)
    echo "Shut yes down"
    export PID=`ps -a |grep yes |awk '{print $1}'`
    kill $PID
    ;;
    *)
    echo "Usage: $0 {start|stop}"
    exit 1
    ;;
    esac
    exit 0
    <end>


    NB: Dit is een ksh script. Controleer eerst in bash of met name
    export PID=`ps -a |grep yes |awk '{print $1}'`
    inderddaad het PID oplevert.
  • je moet inderdaad de proces-id vinden om een programma te killen. (je kan ook killall gebruiken (dat killt alle processen van die naam), maar dat zal iets te rigoreus zijn op sommige systemen.) Zie man kill en man killall.

    de PID kun je achterhalen zoals jhb schrijft, maar daar zitten wat foutjes in:

    je moet doen:

    PID=`ps -a |grep yes|grep -v grep|awk '{print $1}'`

    anders wordt 'grep yes' ook gevonden en gekilld. grep -v haalt regels met grep erin er weer uit.

    verder hoef je PID niet in de environment te zetten met 'export'.

    Er zijn ook veel serverapps die zelf hun PID ergens saven, bijvoorbeeld in een /var
    un/blablabla.pid file. Kijk daar maar eens in, vaak kan je iets doen als [b:d3a66abcfb]kill `cat /var
    un/service_bla.pid`[/b:d3a66abcfb]

    succes!
  • Ik zou dat geen foutjes willen noemen.
    In de ksh (oa AIX) grept 'ps -a | grep ..' zichzelf niet (zie ook laatste opmerking in mijn antwoord).
    En over doen van wel of geen export, valt ook te discussieren. Misschien wil je nog iets meer met die variabele vanuit een andere shell of script(logging bv)?
  • [quote:8d727546ab="jhb"]Ik zou dat geen foutjes willen noemen.
    In de ksh (oa AIX) grept 'ps -a | grep ..' zichzelf niet (zie ook laatste opmerking in mijn antwoord). [/quote:8d727546ab]
    Hoi jhb, dat wist ik niet, sorry! Bij mij grept grep zichzelf soms nét wel, soms nét niet :-)

    Ik probeer het nu trouwens even, maar hij grept zichzelf inderdaad nooit. Hoe kan dat? Bash start de processen in een pipeline toch direct na elkaar op? ps -a zou dan soms de grep yes al te zien moeten krijgen.

    groetjes,
  • Het lijkt erop dat grep zichzelf alleen grept als je de -f optie gebruikt.
    (dus ps -af of ps -ef). De -f optie toont alle processen inclusief de 'family'. Waarschijnlijk wordt de grep in een subshell uitgevord, waarvan het pid niet wordt getoond met ps -a of ps -e maar wel met ps -af of ps -ef.
    Blijf nog één vraag: waarom grept 'ps -ef|grep yes' zichzelf soms niet en soms wel? Je zou verwachten dat het zichzelf altijd zou vinden.

Beantwoord deze vraag

Dit is een gearchiveerde pagina. Antwoorden is niet meer mogelijk.