2017-06-20 97 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'语句仍然没有出现。 –