LINUX.ORG.RU

apcupsd ubuntu 13.10 multiple ups


0

0

Приветствую всех. Недавно приобрел вторую апсину и поставил перед собой задачу получать инфу с обеих через apcupsd. Собственно с того дня и мучаюсь. 3 полных рабочих дня просидел, ковыряясь со скриптами запуска для apcupsd. Также за это время освоил init.d, очередность запуска сервисов и прочие милые вещи, доселе незнакомые мне. Теперь собственно проблема. Имею apc 420 законнекченную через com и 750 через usb. По отдельности (минуя сервис) через /sbin/apcupsd -f /etc/apcupsd/420/apcupsd.conf все работает (кстати много разных методов пробовал, остановился на том, что создал отдельные папки для каждой апсины), также мониторится через CGI скрипт и одновременно запускается и 420 и 750. ( http://188.32.138.198/cgi-bin/multimon.cgi здесь иногда бывает видно ) При запуске системы автоматически запускается сервис apcupsd420. Запускаю повторно 420:

sudo service apcupsd420 start
Starting UPS 420 management: 
A copy of the daemon is still running.  If you just stopped it,
please wait about 5 seconds for it to shut down.

Вроде всё ок. Пытаюсь её остановить:

sudo service apcupsd420 stop
Stopping UPS 420 management: No process in pidfile '/var/run/apcupsd420.pid' found running; none killed.
apcupsd420.
Это проблема номер раз. Вторая, при запущенном при загрузке системы 420 пытаюсь запустить 750:
sudo service apcupsd750 start
Starting UPS 750 management: ****@gladsas-server:~$
Привел вид именно со строкой имени пользователя и сервера, она сдвигается вправо, но мониторя cgi скрипт вижу что нифига не запустилось. (при успешном запуске строчка ****@gladsas-server сдвигается вниз, т.е. происходит успешный старт). И это проблема номер два. Естественно если я пытаюсь остановить 750 через сервис то аналогично остановке 420 сервиса: нет процесса в пид файле.

Скрипт запуска перековырял вдоль и поперек, комбинируя разные варианты из инета. Для ясности приведу окончательный его вид:

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DAEMON=/sbin/apcupsd
DAEMONPID=/var/run/apcupsd420.pid
CONFIG=/etc/default/apcupsd
NAME=apcupsd420
DESC="UPS 420 management"

test -x $DAEMON || exit 0
test -e $CONFIG || exit 0

set -e

. $CONFIG

if [ "x$ISCONFIGURED" != "xyes" ] ;
then
	echo "Please check your configuration ISCONFIGURED in /etc/default/apcupsd"
	exit 0
fi


case "$1" in
	start)
		echo -n "Starting $DESC: "

		rm -f /etc/apcupsd/420/powerfail

		if [ "`pidof apcupsd`" = "" ]
		then
			start-stop-daemon --start --quiet --pidfile $DAEMONPID --exec /sbin/apcupsd -- -f /etc/apcupsd/420/apcupsd.conf
			echo "$NAME."
		else
			echo ""
			echo "A copy of the daemon is still running.  If you just stopped it,"
			echo "please wait about 5 seconds for it to shut down."
			exit 0
		fi
		;;

	stop)
		echo -n "Stopping $DESC: "
		start-stop-daemon --stop --oknodo --pidfile $DAEMONPID || echo "Not Running."
		rm -f /var/run/apcupsd420.pid
		echo "$NAME."
		;;

	restart|force-reload)
		echo -n "Restarting $DESC: "
 		start-stop-daemon --stop --quiet --pidfile $DAEMONPID
  		sleep 10
 		start-stop-daemon --start --quiet --pidfile $DAEMONPID --exec $DAEMON
 		echo "apcupsd."
		;;

	status)
		#/sbin/apcaccess status
		$APCACCESS status 127.0.0.1:3551
		;;

	*)
		N=/etc/init.d/$NAME
		echo "Usage: $N {start|stop|restart|force-reload}" >&2
		exit 1
		;;
esac

exit 0

Для 750 скрипт такой же, просто 3 циферки изменены там где надо. ЗЫ если что-то не убрал под спойлер, тапком не бить.

Только что заметил ещё одну интересную особенность: в /var/run у меня файлик apcupsd.pid, а того что я указывал в скрипте запуска и конфигах (*420.pid или *750.pid) я не вижу. Очень странно.

Дак для самого apcupsd тоже надо указывать pid-файл (см. man). start-stop-daemon только читает из этого файла, пишет туда демон.

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

Такое ощущение что в скомпиленном демоне прописано создавать apcupsd.pid, поскольку вроде бы везде где можно я указал как надо - apcupsd420.pid

Это здесь указывается? Вот указано вроде.

@gladsas-server:~$ cat /etc/apcupsd/420/apccontrol

prefix=/usr
exec_prefix=${prefix}

APCPID=/var/run/apcupsd420.pid
APCUPSD=/sbin/apcupsd
SHUTDOWN=/sbin/shutdown
SCRIPTSHELL=/bin/sh
SCRIPTDIR=/etc/apcupsd/420
WALL=wall
gladsas ()
Ответ на: комментарий от gladsas

Что это за файл? Это же кусок скрипта. Вам же именно нужны параметры демона, да, по умолчанию pid-файл это /var/run/apcupsd.pid.

Отправляю вас ещё раз — ″man apsupsd″, там чётко написано, какой опцией командной строки задавать имя pid-файла. И там, где у вас start-stop-daemon --start ... указываете демону имя PID-файла.

Кстати, у вас там при ″restart″ не указывается конфиг демона, в отличии от ″start″, это неправильно, в обоих случаях демон должен запускаться с одинаковыми опциями, во избежании.

P.S. То, что вы в остальных местах поменяли имя pid-файла, это правильно, но, как я уже говорил, это всё «чиатели», теперь вам нужно указать «писателю» (демону) куда выводить pid.

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

Указал в лоб

start-stop-daemon --start --pidfile /var/run/apcupsd420.pid --quiet --exec /sbin/apcupsd -- -f /etc/apcupsd/420/apcupsd.conf
Ничего по сути не изменилось.

http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=294256 Здесь что-то есть, через for и do, но у меня реализовано немного по-другому, поэтому непонятно как его правильней прописать.

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

Вместо строчки выше указал

daemon /sbin/apcupsd -f /etc/apcupsd/420/apcupsd.conf -P /var/run/apcupsd420.pid
Starting UPS 420 management: /etc/init.d/apcupsd420: 44: /etc/init.d/apcupsd420: daemon: not found

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

Скрипт запуска lightdm

PIDFILE=/var/run/lightdm.pid
SSD_START_ARGS="--pidfile $PIDFILE --name $(basename $DAEMON) --startas $DAEMON -- -d"

И что я собственно не так указал? --pidfile он так и указывается. Проблема в том, что я не могу понять куда подставить этот параметр чтобы заставить демона записать пидфайл туда куда я хочу.

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

В общем я сделал. Вы оказались не правы, pidfile я написал правильно, просто его нужно было писать за — (не знаю синтаксиса, и что эти две черточки означают, но полагаю что после них задаются всякие параметры для запуска демона. Получилось вот так:

	start)
		echo -n "Starting $DESC: "

		rm -f /etc/apcupsd/750/powerfail

			start-stop-daemon --start --pidfile $DAEMONPID --quiet --exec /sbin/apcupsd -- -f /etc/apcupsd/750/apcupsd.conf --pid-file $DAEMONPID
			echo "$NAME."

		;;
Также, как видите, убрал проверку на запуск более одной копии демона (некоторая проблема тоже была в этом, видно даже когда я делал правильно то эта проверка не давала мне запустить вторую копию демона)

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

Не знаю, в чём я был не прав, я именно говорил, что pid-файл нужно указывать и демону, а не только остальным. Демоном в данном случае является команда /sbin/apcupsd, её параметры при запуске через start-stop-daemon, как вы уже догадались, указываются после --. Я считал, что вы это и так знали, раз правильно указывали файл конфигурации.

как видите, убрал проверку на запуск более одной копии демона

Да, проверка там была какая то странная. В init-скриптах принято создавать файл в /var/lock/subsys и проверять его наличие. А уж проверять есть ли процесс в списке процессов, есть ли pid принято в секции status.

И я не понял, вы поправили вот это место или нет:

	restart|force-reload)
		echo -n "Restarting $DESC: "
 		start-stop-daemon --stop --quiet --pidfile $DAEMONPID
  		sleep 10
 		start-stop-daemon --start --quiet --pidfile $DAEMONPID --exec $DAEMON
 		echo "apcupsd."
		;;

mky ★★★★★ ()
Последнее исправление: mky (всего исправлений: 1)
Ответ на: комментарий от mky

Поправил, но пид указал два раза, до — прописал как pidfile и после — как pid-file, выше видно. Без pidfile не запускается. А без pid-file не записывается пид файл в /var/run

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