2017-06-20 116 views
0

我剛剛熟悉Linux,我似乎無法得到start-stop-daemon由於目錄問題而運行python腳本。 Linux文件結構,我有文件:Linux啓動 - 停止 - 守護進程目錄錯誤調用shell/python腳本

〜/ 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 

從任何目錄調用sudo bash ~/test.sh時,test.log按預期填充,標準輸出源自test.py。出於某種原因,在開始下面開始-stop-daemon的服務腳本會產生一個test.log中但不與標準輸出來填充它:

/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 

這是一個目錄問題,可以在start-stop-daemon內解決? 或者我會開到腳本服務的其他方法,可以通過冷啓動持續(即不cron作業)

回答

0

嘗試使用絕對路徑調用cd,例如/home/alexjg/而不是~/;之前破解的原因是在你的例子中你使用的是sudo,它保持用戶的主目錄運行它。但是,當您從init調用bash腳本時,它將使用root的主目錄,而不包含test.py

該文件是由於重定向仍然成功而創建的;然而,因爲啓動Python失敗,沒有輸出。

+0

將'cd〜/'改爲絕對路徑'cd/home/alex'仍然會導致一個空的* test.log *。另外,在調用* test.py *之前'cd'強制日誌記錄之前,不會有'echo'SHELL SCRIPT SUCCESS>>/var/log/test.log'這行嗎? –

+0

@AlexJG您正在使用一個'>',這意味着覆蓋而不是追加。 – jacob

+0

將'>'的兩個實例替換爲'>>'導致將'SHELL SCRIPT SUCCESS'寫入* test.log *!然而,* test.py *中的'print'語句仍然沒有出現。 –