모션 시작 시퀀스 - 쉘 스크립트 수정

모션 시작 시퀀스 - 쉘 스크립트 수정

다음 라이브러리를 사용하여 Motion을 시작하기 위해 이 스크립트를 수정하려고 했습니다.

터미널에 다음 명령을 입력하여 스크립트를 시작합니다.

sudo /etc/init.d/motion start

다음을 제공합니다:

start-stop-daemon: user '/etc/motion/motion.conf' not found
Starting motion detection daemon: motion failed!

나는 Motion.conf 파일이 올바른 권한을 가지고 있고 /etc/motion/ 디렉토리에 있는지 세 번 확인했습니다.

터미널에 다음 명령을 입력하면 모션이 올바르게 시작됩니다.

LD_PRELOAD=/usr/lib/uv4l/uv4lext/armv6l/libuv4lext.so motion -c /etc/motion/motion.conf

스크립트가 포함되어 /etc/init.d있으며 모션이라고 합니다.

#!/bin/sh -e
#
# /etc/init.d/motion: Start the motion detection
#
### BEGIN INIT INFO
# Provides:   motion
# Required-Start: $local_fs $syslog $remote_fs
# Required-Stop: $remote_fs
# Default-Start:  2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start Motion detection
# Description: loads motion and assigns privileges
### END INIT INFO

# Ported to new debian way using sh and /lib/lsb/init-functions
# by Angel Carpintero <[email protected]>
# Modified by : Juan Angulo Moreno <[email protected]>
# eddy Petrisor <[email protected]>
# ArAge <[email protected]>


NAME=motion
PATH_BIN=/bin:/usr/bin:/sbin:/usr/sbin
DAEMON=/usr/bin/motion
PIDFILE=/var/run/$NAME.pid
DEFAULTS=/etc/default/$NAME
DESC="motion detection daemon"
export "LD_PRELOAD=/usr/lib/uv4l/uv4lext/armv6l/libuv4lext.so" 

###########################################################################################################
### this above command is what is needed to be entered into terminal to run motion from command prompt ####
###########################################################################################################
ENV="env -i LANG=C PATH=$PATH_BIN"

. /lib/lsb/init-functions

test -x $DAEMON || exit 0

RET=0

[ -r "$DEFAULTS" ] && . "$DEFAULTS" || start_motion_daemon=yes


check_daemon_enabled () {
    if [ "$start_motion_daemon" = "yes" ] ; then
        return 0

    else
        log_warning_msg "Not starting $NAME daemon, disabled via /etc/default/$NAME"
        return 1
    fi

}


case "$1" in

  start)
    if check_daemon_enabled ; then
        if ! [ -d /var/run/motion ]; then
                mkdir /var/run/motion
        fi
        chown motion:motion /var/run/motion
        chmod 777 /var/run/motion
        # this is the fix we've added to allow the network share to be connected first before we try to start motion:

        sleep 30

        log_daemon_msg "Starting $DESC" "$NAME" 
        if start-stop-daemon --start --oknodo --exec $DAEMON -b --chuid motion $DAEMON -c /etc/motion/motion.conf ; then
            log_end_msg 0
         else
            log_end_msg 1
            RET=1
        fi
    fi
    ;;

  stop)
    log_daemon_msg "Stopping $DESC" "$NAME"
    if start-stop-daemon --stop --oknodo --exec $DAEMON --retry 30 ; then
        log_end_msg 0
    else
        log_end_msg 1
        RET=1
    fi
    ;;

  reload|force-reload)
    log_daemon_msg "Reloading $NAME configuration"
    if start-stop-daemon --stop --signal HUP --exec $DAEMON ; then
        log_end_msg 0
    else
        log_end_msg 1
        RET=1
    fi
    ;;

  restart-motion)
    if check_daemon_enabled ; then
        log_action_begin_msg "Restarting $NAME"
        if $0 stop && $0 start ; then
            log_action_end_msg 0
        else
            log_action_cont_msg "(failed)"
            RET=1
        fi
    fi
    ;;

  restart)
    $0 restart-motion
    ;;

  *)
    echo "Usage: /etc/init.d/$NAME {start|stop|restart|reload}"
    RET=1
    ;;
esac


exit $RET

Anthon과 Mikeserv의 도움에 따라 다음과 같은 추가 정보가 제공됩니다.

1) 명령:ls -lrt /var/log

다음을 제공합니다:

-rw-r----- 1 루트 adm 122336 10월 12일 08:10 auth.log

2) auth.log 항목은 다음을 제공합니다.

08:10:26 raspberrypi sudo: pam_unix(sudo:session): 사용자 루트에 대한 세션이 닫혔습니다.

답변1

다음 줄을 LOAD_LIBRARIES.... 다음으로 바꾸세요.

export LD_PRELOAD=/usr/lib/uv4l/uv4lext/armv6l/libuv4lext.so

이렇게 하면 스크립트에서 호출된 명령/프로그램에 LD_PRELOAD 설정을 사용할 수 있습니다(예:motion

그리고 라인if start-stop-daemon --start ....

if start-stop-daemon --start --oknodo --exec $DAEMON -b --chuid motion $DAEMON -c /etc/motion/motion.conf ; then

start-stop-daemon옵션 은 사용자 이름을 매개변수로 사용하므로 해당 이름이 될 것으로 --chuid예상됩니다 . motion그러면 원래 줄에 명령이 남지 않으므로 $DAEMON(에 대한 전체 경로 motion)과 해당 명령줄 매개변수를 거기에 삽입해야 합니다.

답변2

여러 시간 동안의 좌절과 포럼 회원들의 많은 도움 끝에 저는 이 작업을 수행할 수 있었습니다. 나는 답변을 게시함으로써 이에 대한 공로를 결코 인정하지 않으며 사람들이 나에게 준 모든 도움에 감사드립니다. 하지만 완전성을 갖추기 전에 이것이 제가 한 방법입니다.

export LD_PRELOAD=/usr/lib/uv4l/uv4lext/armv6l/libuv4lext.so스크립트에 해당 줄을 추가 /etc/init.d/motion하고 사진을 저장하는 폴더에 사용자 모션이 쓸 수 있는 권한이 있는지 확인했습니다.

#!/bin/sh -e
#
# /etc/init.d/motion: Start the motion detection
#
### BEGIN INIT INFO
# Provides:   motion
# Required-Start: $local_fs $syslog $remote_fs
# Required-Stop: $remote_fs
# Default-Start:  2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start Motion detection
# Description: loads motion and assigns privileges
### END INIT INFO

# Ported to new debian way using sh and /lib/lsb/init-functions
# by Angel Carpintero <[email protected]>
# Modified by : Juan Angulo Moreno <[email protected]>
# eddy Petrisor <[email protected]>
# ArAge <[email protected]>


NAME=motion
PATH_BIN=/bin:/usr/bin:/sbin:/usr/sbin
DAEMON=/usr/bin/motion
PIDFILE=/var/run/$NAME.pid
DEFAULTS=/etc/default/$NAME
DESC="motion detection daemon"


ENV="env -i LANG=C PATH=$PATH_BIN"

. /lib/lsb/init-functions

test -x $DAEMON || exit 0

RET=0

[ -r "$DEFAULTS" ] && . "$DEFAULTS" || start_motion_daemon=yes


check_daemon_enabled () {
    if [ "$start_motion_daemon" = "yes" ] ; then
        return 0

    else
        log_warning_msg "Not starting $NAME daemon, disabled via /etc/default/$NAME"
        return 1
    fi

}

case "$1" in

  start)
    if check_daemon_enabled ; then
        if ! [ -d /var/run/motion ]; then
                mkdir /var/run/motion
        fi
        chown motion:motion /var/run/motion
        #=================insert this line to  load the uv4l libraries====
        export LD_PRELOAD=/usr/lib/uv4l/uv4lext/armv6l/libuv4lext.so
        #=================================================================
        chmod 777 /var/run/motion
        sleep 30

        log_daemon_msg "Starting $DESC" "$NAME" 
        if start-stop-daemon --start --oknodo --exec $DAEMON -b --chuid motion ; then
            log_end_msg 0
         else
            log_end_msg 1
            RET=1
        fi
    fi
    ;;

  stop)
    log_daemon_msg "Stopping $DESC" "$NAME"
    if start-stop-daemon --stop --oknodo --exec $DAEMON --retry 30 ; then
        log_end_msg 0
    else
        log_end_msg 1
        RET=1
    fi
    ;;

  reload|force-reload)
    log_daemon_msg "Reloading $NAME configuration"
    if start-stop-daemon --stop --signal HUP --exec $DAEMON ; then
        log_end_msg 0
    else
        log_end_msg 1
        RET=1
    fi
    ;;

  restart-motion)
    if check_daemon_enabled ; then
        log_action_begin_msg "Restarting $NAME"
        if $0 stop && $0 start ; then
            log_action_end_msg 0
        else
            log_action_cont_msg "(failed)"
            RET=1
        fi
    fi
    ;;

  restart)
    $0 restart-motion
    ;;

  *)
    echo "Usage: /etc/init.d/$NAME {start|stop|restart|reload}"
    RET=1
    ;;
esac


exit $RET

관련 정보