LINUX.ORG.RU

запись в каталог /var/run

 ,


0

1

процесс запускается от имени юзера, но при старте не хватает прав на запись pid-файла в в каталог /var/run, т.к. запись разрешена только руту:

/var/run - симлинк на /run drwxr-xr-x 23 root root 900 Мар 14 14:10 run/

и процесс не может запуститься...

как можно обойти сабж?

Ответ на: комментарий от gigantischer

Исходники же. Хоть вот polipo возми (взял наугад из /var/run. Он под собственным пользователем работает)

lisper-pipisper
()

В /var/run лежат PID'ы не абы чего, а системных сервисов. А init-скрипт всегда стартует от root. Если хочется понизить привилегии, то скрипт может запустить дочерний процесс и записать его PID в нужный каталог. То есть основную работу выполняет пользовательский процесс, но его PID сохраняет рутовый.

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

Кстати, подкинул идею:

#!/bin/sh
#
# $FreeBSD: head/devel/distcc/files/distccd.in 357545 2014-06-11 22:19:30Z skreuzer $
#    $MCom: ports/devel/distcc/files/distccd.sh.in,v 1.1 2007/05/19 17:43:14 ahze Exp $

# PROVIDE: distccd
# REQUIRE: NETWORKING ldconfig
# KEYWORD: shutdown

#
# Add the following lines to /etc/rc.conf to enable distccd:
#
# distccd_enable (bool):	Set to YES to enable distccd.
# distccd_flags (str):		Arguments passed to distccd.
# distccd_path (str):		DISTCCD_PATH environment value for distccd..
#

distccd_enable=${distccd_enable-"NO"}
distccd_flags=${distccd_flags-"--allow 192.168.10.0/24 --jobs 4 --listen ressurected.home --user distcc --daemon -P /var/run/distccd.pid --stats"}

. /etc/rc.subr

name=distccd
rcvar=distccd_enable

command=/usr/local/sbin/${name}
# extract pid file from distccd_flags (if any)
pidfile="`echo ${distccd_flags} |sed -nE -e 's/^.*-P ([^ ]+).*$/\1/p'`"
# set default value
pidfile=${pidfile:-/var/run/distccd.pid}

distccd_precmd()
{
	# distccd drops root privileges and then attempts to create the pid file
	touch ${pidfile}
	chown distcc:distcc ${pidfile}

	if [ -n "${distccd_path}" ]
	then
		export DISTCCD_PATH="${distccd_path}"
	fi
}

start_precmd="distccd_precmd"
load_rc_config ${name}
run_rc_command "$1"

Это из distcc. Also:

Don't put the PID file in /var/run/foo.pid, put it in /var/run/foo/foo.pid and have /var/run/foo owned by user foo and group foo. That way you can delete the pid file before exiting and you don't have to raise your privilege level.

lisper-pipisper
()
Ответ на: комментарий от gigantischer

Так ладно, пошутили и хватит.
Зачем тебе именно в /var/run писать? Чем хомяк не угодил? И уже было сказано как писать в /var/run/...

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

ТЗ такое писать в /var/run(( хоть и было сказано-я не догоняю как писать в /var/run... установить polipo и по аналогии в его скрипте каком-то?

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

Я ж тебе уже 3 способа дал:

1) Пиши и понижай привилегии (man 2 setuid)

2) Создай pid-файл из инит-скрипта и сделай chown

3) Создай папку /var/run/yourdaemonname и сделай chown на ней

lisper-pipisper
()
Ответ на: комментарий от lisper-pipisper

Don't put the PID file in /var/run/foo.pid, put it in /var/run/foo/foo.pid and have /var/run/foo owned by user foo and group foo.

Во-первых, вот это уж точно не соответствует FHS: «Applications must generally not add directories to the top level of /var. Such directories should only be added if they have some system-wide implication, and in consultation with the FHS mailing list.»

Во-вторых, это что же, если пользователя зовут Опанасенко Пётр Тимофеевич и он зарегистрирован под логином opt, то /var/opt — это теперь его личная диретория, что ли?

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

Ты читать умеешь?

/var/RUN/username

Во-вторых, это что же, если пользователя зовут Опанасенко Пётр Тимофеевич

Ещё раз, мы говорим о ДЕМОНЕ, а не о ЧЕЛОВЕКЕ-ПОЛЬЗОВАТЕЛЕ. У ДЕМОНА часто бывает свой пользователь (который не может залогиниться, так как у него стоит nologin для логина, а хомяк прописан куда-нибудь в /nonexistent). Так делают для того, чтобы сложные демоны не работали от рута.

lisper-pipisper
()
Ответ на: комментарий от lisper-pipisper

У ДЕМОНА часто бывает свой пользователь (который не может залогиниться

А вот об этом я и не подумал. Я думал о сессионных демонах, которые, например, запускаются от имени каждого пользователя, когда он логинится в в систему.

Да, тогда будет разумно создать в /var/run директорию для демона и там создавать PID-файл, наверное. Более того, FHS 2.3 говорит: «Programs may have a subdirectory of /var/run; this is encouraged for programs that use more than one run-time file.» FHS 3 (бета-версия) советует использовать /run вместо /var/run.

proud_anon ★★★★★
()

Либо сервис запускается от root, открывает пидфайл и сбрасывает привилегии, либо сервис запускается не от root, а pidfile сохраняет в поддиректории в /var/run с соответствующими владельцем и правами.

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