2017-06-20 5 views
0

Ich bin gerade mit Linux vertraut und ich kann nicht scheinen start-stop-daemon, um ein Python-Skript aufgrund von Verzeichnisproblemen auszuführen. In einer Linux-Dateistruktur habe ich die Dateien:Linux Start-Stop-Daemon-Verzeichnis Fehler Aufruf Shell/Python-Skript

~/test.txt

THIS LINE IS A TEST 

~/test.py

#!/usr/bin/python 
import time 

with open("test.txt") as f: 
    while True: 
     try: 
      print("Hello World") 
      print(f.readline()) 
      time.sleep(2) 
     except KeyboardInterrupt: 
      f.close() 
      break 

~/test.sh

#!/bin/bash 

echo "SHELL SCRIPT SUCCESS" > /var/log/test.log 
cd ~/ 
./test.py > /var/log/test.log 

Nach Aufruf von sudo bash ~/test.sh aus einem beliebigen Verzeichnis wird die test.log wie erwartet mit dem von stammenden test.py gefüllt. Aus irgendeinem Grunde beginnt den folgenden Start-Stopp-Daemon Service Skript wird ein test.log erzeugen, aber es funktioniert nicht mit dem stdout bevölkern:

/etc/init.d/test

#!/bin/sh 

### BEGIN INIT INFO 
# Provides:  Python test script 
# Required-Start: $remote_fs $syslog 
# Required-Stop: $remote_fs $syslog 
# Default-Start: 2 3 4 5 
# Default-Stop:  0 1 6 
# Short-Description: Prints out daemonized argument 
# Description:  Creates output of argument 
### END INIT INFO 

DAEMON_DIR=/home/alex 
DAEMON=$DAEMON_DIR/test.sh 
DAEMON_NAME=test 

DAEMON_OPTS="hello" 
DAEMON_USER=root 
PYTHON=/usr/bin/python 

PIDFILE=/var/run/$DAEMON_NAME.pid 

. /lib/lsb/init-functions 

do_start() { 
    log_daemon_msg "Starting system $DAEMON_NAME daemon" 
    #start-stop-daemon --start --background --pidfile $PIDFILE --make-pidfile --user $DAEMON_USER --exec $PYTHON --startas $DAEMON 
    start-stop-daemon --start --background --pidfile $PIDFILE --make-pidfile --chuid $DAEMON_USER --startas /bin/bash /home/alex/test.sh 
    log_end_msg $? 
} 

do_stop() { 
    log_daemon_msg "Stopping system $DAEMON_NAME daemon" 
    start-stop-daemon --stop --pidfile $PIDFILE --retry 10 
    log_end_msg $? 
} 

case "$1" in 

    start|stop) 
    do_${1} 
    ;; 

    restart|reload|force-reload) 
    do_stop 
    do_start 
    ;; 

    status) 
    status_of_proc "$DAEMON_NAME" "$DAEMON" && exit 0 || exit $? 
    ;; 

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

esac 
exit 0 

Ist dies ein Verzeichnisproblem, das innerhalb der start-stop-daemon adressiert werden kann? Alternativ würde ich zu anderen Methoden der Skript Wartung geöffnet sein, die durch einen Kaltstart (das heißt keine Cron-Jobs)

Antwort

0

Versuchen Aufruf cd über einen absoluten Pfad, zum Beispiel /home/alexjg/ statt ~/ bestehen kann; Der Grund dafür war, dass Sie in Ihrem Beispiel sudo verwenden, das das Home-Verzeichnis des Benutzers führt, der es ausführt. Wenn Sie jedoch das bash-Skript von init aufrufen, wird stattdessen das Stammverzeichnis von root verwendet, das test.py nicht enthält.

Die Datei wird erstellt, da die Umleitung immer noch erfolgreich ist; Da jedoch der Start von Python fehlgeschlagen ist, wurde keine Ausgabe ausgegeben.

+0

Das Ändern von 'cd ~ /' in einen absoluten Pfad 'cd/home/alex' führt immer noch zu einem leeren * test.log *. Außerdem würde die Zeile "echo" SHELL SCRIPT SUCCESS ">/var/log/test.log" vor dem 'cd' nicht vor dem Aufruf von * test.py * protokollieren? –

+0

@AlexJG Du verwendest ein einzelnes '>', das bedeutet überschreiben und nicht anhängen. – jacob

+0

Das Ersetzen beider Instanzen von '>' nach '>>' führte dazu, dass 'SHELL SCRIPT SUCCESS' in * test.log * geschrieben wurde! Die 'print'-Anweisungen in * test.py * werden jedoch immer noch nicht angezeigt. –