Ошибка каталога start-stop-daemon в Linux при вызове сценария shell/python

Я только знакомлюсь с Linux, и я не могу получить start-stop-daemon запустить скрипт Python из-за проблем с каталогом. В структуре файлов Linux у меня есть файлы:

~ / 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 заполняется, как и ожидалось, stdout, происходящим из test.py. По какой-то причине запуск следующего скрипта службы start-stop-daemon создаст test.log, но НЕ заполняет его stdout:

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

1 ответ

Решение

Попробуйте позвонить cd используя абсолютный путь, например /home/alexjg/ вместо ~/; причина, по которой он был сломан, заключается в том, что в вашем примере вы используете sudo который хранит домашний каталог пользователя, запустившего его. Однако, когда вы вызываете скрипт bash из init, он будет использовать домашний каталог root, который не содержит test.py,

Файл создан, потому что перенаправление все еще успешно; однако из-за сбоя запуска Python не было выходных данных.

Другие вопросы по тегам