LINUX.ORG.RU

Скрипт в init.d для запуска VLC


1

3

Добрый вечер. Хочу сделать так, чтобы после загрузки запускался VLC и играл видео с IP видеокамеры. На машине X сервер не установлен. Если запустить скрипт в дисплейной консоли, то всё работает. При загрузке видео не стартует, из лога я вытащил вот такие сообщения:

fb generic error: cannot set terminal mode (Operation not permitted)
[0x955dc2c] main generic debug: no vout display module matching «fb» could be loaded
[0x8579d34] fb generic error: cannot set terminal mode (Operation not permitted)
[0x84c5144] main video output error: video output creation failed
[0x83ceb04] main decoder error: failed to create video output

Сам скрипт:

#!/bin/sh
# /etc/init.d/videoserver
# description: Display video from CCTV camera starting script
# processname: videoserver
# chkconfig: 2345 50 01
### BEGIN INIT INFO
# Provides:		videoserver
# Required-Start: 
# Required-Stop:
# Default-Start:	2 3 4 5
# Default-Stop:		0 1 6
# Short-Description:	Videoserver starting daemon
# Descrioption:		Enable display video from CCTV camera
### END INIT INFO
. /lib/lsb/init-functions
RETVAL=0
prog="videoserver"
start() {
	echo -n "Starting $prog"
	su - engineer -c "/usr/bin/vlc-wrapper -vvv -I dummy -V fb rtsp://192.168.0.19:554 >/home/engineer/vlc.log 2>/home/engineer/vlcerr.log"
	RETVAL=$?
	[ "$RETVAL" = 0 ] && touch /var/lock/subsys/$prog
	echo
}
stop() {
	echo -n "Stopping $prog"
	killproc $prog -TERM
	RETVAL=$?
	[ "$RETVAL" = 0 ] && rm -f /var/lock/subsys/$prog
	echo
}
reload() {
	echo -n "Reloading $prog"
	killproc $prog -HUP
	RETVAL=$?
	echo
}
case "$1" in
	start)
		start
		;;
	stop)
		stop
		;;
	restart)
		stop
		start
		;;
	reload)
		reload
		;;
	condrestart)
		if [ -f /var/lock/subsys/$prog ] ; then
			stop
			# avoid race
			sleep 3
			start
		fi	
		;;
	status)
		status $prog
		RETVAL=$?
		;;
	*)
		echo $"Usage: $0 {start|stop|restart|reload|condrestart|status}"
		RETVAL=1
esac
exit $RETVAL	

Так как vlc не дает запускаться от рута, приходится использовать vlc-wrapper от имени юзера. Права на некоторых действующих лиц:
crw-rw---- 1 root video 29, 0 Dec 4 12:28 /dev/fb0
-rwsr-xr-x 1 root root 6064 Jun 9 2011 /usr/bin/vlc-wrapper
-rwsr-xr-x 1 root root 1535 Dec 4 12:18 /etc/init.d/videoserver
Что делать?))

Использовать start-stop-daemon — он умеет --chuid. Пример именно для VLC могу привести, коль надо.

beastie ★★★★★ ()
Ответ на: комментарий от brotherrabbit
#! /bin/sh
### BEGIN INIT INFO
# Provides:          vlc
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: VLC http daemon
# Description:       VLC http daemon
### END INIT INFO

PATH=/sbin:/usr/sbin:/bin:/usr/bin
DESC="VLC http daemon"
NAME=vlc
DAEMON=/usr/bin/$NAME
DAEMON_ARGS="-I http -d" # тут поправить по вкусу
PIDFILE=/var/run/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME
UID=mp3 # тут тоже поправить

[ -x "$DAEMON" ] || exit 0
[ -r /etc/default/$NAME ] && . /etc/default/$NAME
. /lib/init/vars.sh
. /lib/lsb/init-functions

do_start()
{
        start-stop-daemon --start --quiet --make-pidfile \
                --pidfile $PIDFILE --chuid $UID \
                --exec $DAEMON --test > /dev/null || return 1
        start-stop-daemon --start --quiet --make-pidfile \
                --pidfile $PIDFILE --chuid $UID \
                --exec $DAEMON -- $DAEMON_ARGS || return 2
}

do_stop()
{
        start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 \
                --pidfile $PIDFILE --name $NAME
        RETVAL="$?"
        [ "$RETVAL" = 2 ] && return 2
        start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON
        [ "$?" = 2 ] && return 2
        rm -f $PIDFILE
        return "$RETVAL"
}

do_reload() {
        start-stop-daemon --stop --signal 1 --quiet --pidfile $PIDFILE --name $NAME
        return 0
}

case "$1" in
  start)
        [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME"
        do_start
        case "$?" in
                0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
                2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
        esac
        ;;
  stop)
        [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
        do_stop
        case "$?" in
                0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
                2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
        esac
        ;;
  status)
       status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $?
       ;;
  restart|force-reload)
        log_daemon_msg "Restarting $DESC" "$NAME"
        do_stop
        case "$?" in
          0|1)
                do_start
                case "$?" in
                        0) log_end_msg 0 ;;
                        1) log_end_msg 1 ;; # Old process is still running
                        *) log_end_msg 1 ;; # Failed to start
                esac
                ;;
          *)
                # Failed to stop
                log_end_msg 1
                ;;
        esac
        ;;
  *)
        echo "Usage: $SCRIPTNAME {start|stop|status|restart|force-reload}" >&2
        exit 3
        ;;
esac
beastie ★★★★★ ()
Ответ на: комментарий от hope13

Намек прозрачен. Но почему в консоли загрузившейся системы прав на запуск хватает, а когда сервис запускается инитом при старте их недостаточно?

brotherrabbit ()
Ответ на: комментарий от brotherrabbit

Вероятно порядок запуска ?

Я могу ошибаться но есть в init.d скрипт udev который собственно и приводит права на устройства в порядок, видимо Ваш запускается до него и соответственно нет доступа.

hidden_4003 ()
Ответ на: комментарий от brotherrabbit

Может быть потому, что login, помимо всего прочего, выдаёт chown и chmod на /dev/tty?, на котором выполняется?

ABW ★★★★★ ()
Ответ на: комментарий от hidden_4003

+ еще ConsoleKit дополнительно выдает права на устройства при логине.

eagleivg ★★★★★ ()

Ну конечно же, getty!

1:2345:respawn:/sbin/getty -n -l /home/engineer/vlcstart 38400 tty1

Всем спасибо! *Ушел допиливать параметры и скрипт*

brotherrabbit ()
Ответ на: комментарий от brotherrabbit

Время год прошло с создания поста, но точно такая же ситуация.

К сожалению познания мои еще слабы и все что написано правильно понять не могу. Если не сложно, дайте ответ как разрешили проблему-то свою и желательно по проще)

vTanke ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.