LINUX.ORG.RU

Куда лучше класть socket-файлы и pid-файлы?

 ,


0

1

Существует приложение, которое работает через supervisord от пользователя www-data.

Где лучше располагать socket-файлы? Нужно, чтобы в этой директории не root-пользователь мог создавать socket-файлы в момент запуска приложения. И чтобы директория очищалась после ребута (потому что если сервер перезагрузится аварийно, приложение не сможет запуститься само, оно будет говорить о том, что socket-файл уже существует).

/tmp/ не подходит, так как оно самоощищается в Ubuntu через N дней. Менять это поведение не хочется, так как там реально хранится мусор, который надо подчищать. /var/run не подходит, так как там только root может создавать файлы и каталоги.

/var/tmp – не уверен, что хорошая идея.

Интересует на Ubuntu 20.04 и Centos 7\8.

Перейти на запуск приложения через systemd не предлагать.

★★★

Последнее исправление: iljuase (всего исправлений: 1)

Ответ на: комментарий от anonymous
vodka@vodka-PC:~$ >/run/aaaaa
bash: /run/aaaaa: Permission denied

Оно опять только для root.

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

При старте создай директорию /run/appname от рута и дай нужному пользователю права на запись. Но systemd это позволяет делать удобнее, конечно же.

TeopeTuK ★★★★
()

Удваиваю $XDG_RUNTIME_DIR

$XDG_RUNTIME_DIR defines the base directory relative to which user-specific non-essential runtime files and other file objects (such as sockets, named pipes, …) should be stored. The directory MUST be owned by the user, and he MUST be the only one having read and write access to it. Its Unix access mode MUST be 0700.

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

В Ubuntu, например:

vodka@vodka-PC:~$ echo $XDG_RUNTIME_DIR
/run/user/1000
vodka@vodka-PC:~$

В то же время приложение работает от www-data, но готового каталога не существует:

vodka@vodka-PC:~$ ls -l /run/user/
total 0
drwx------ 15 vodka vodka 460 июл 26 19:16 1000
vodka@vodka-PC:~$ 

Вопросы:

1) И как сделать так, чтобы каталог под /run/user создавался автоматически при ребуте для www-data?

2) А если переменная окружения XDG_RUNTIME_DIR будет смотреть на рандомную директорию, например, /home/www-data/runtime_dir, она же не будет очищаться автоматически при ребуте, как мне надо? В чём тогда профит?

iljuase ★★★
() автор топика
Последнее исправление: iljuase (всего исправлений: 3)

/etc/tmpfiles.d/

Там прописываешь создание нужной тебе директории с нужными правами где угодно. Я обычно /var/run/programname/ использую.

Подробности в man tmpfiles.d

shell-script ★★★★★
()
Ответ на: комментарий от shell-script
Line references path below legacy directory /var/run/, updating /var/run/paidserv/ → /run/paidserv/; please update the tmpfiles.d/ drop-in file accordingly.

Пишут, что сейчас желательно просто /run/programname использовать.

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

Давно уже. В генте уже несколько лет как:

$ ls -l /var/run
lrwxrwxrwx 1 root root 4 2017-05-25 04:25:24 /var/run -> /run

dimgel ★★★★★
()

Располагай где угодно. Обычно где-то в /var. Но подчищай сам при старте или завершении приложения тем или иным способом, не стоит рассчитывать на ОС, тут единых механизмов особо нет. С systemd ещё можно попробовать что-то сообразить, но если ты на него завязываться не хочешь, тем более вариантов нет.

Хотя отказ от systemd звучит очень странно, тем более, что речь идёт о современных дистрибутивах. Кто вообще твой сервис будет тогда запускать?

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

Но подчищай сам при старте или завершении приложения тем или иным способом, не стоит рассчитывать на ОС

Что насчёт зачистки в случае крэша?

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

В интернете одна бабка сказала?

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

Да, точно. Там же сейчас симлинки эти сделали. Но суть та же. Ну и это warning, можно игнорить.

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

tmpfiles.d был в те времена, когда systemd ещё не придумали. Сейчас systemmd поглотил его и сделал своей частью, но сломать ещё не успел. Так что вполне можно использовать как универсальное решение.

shell-script ★★★★★
()
Ответ на: комментарий от anonymous

Нужно мониторить так или иначе валидность сокетов и зачищать если что.

Кстати, вопрос: возможно ли валидировать сокет без обращения к владельцу? Формально да - try socket.open() catch

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

Кто вообще твой сервис будет тогда запускать?

supervisord, об этом я упомянул ещё в первом посте.

supervisor – это и есть некий аналог systemd, он появился раньше. У нас все приложения запускаются через него. Это удобнее, чем плодить кучу сервисом в systemd. Иногда количество сервисов достигает 20-40 на одном сервере. И каждый раз править unit не очень.

  • у заказчика есть legacy-дистрибутивы без systemd. А supervisord работает везде.
iljuase ★★★
() автор топика
Ответ на: комментарий от Legioner

Но подчищай сам при старте или завершении приложения тем или иным способом, не стоит рассчитывать на ОС

Приложения работают на gunicorn и celery (+ celery beat). Сам переделать приложения я уж не смогу, разработчики наши вряд ли тоже будут тратить на это время. Ну и если можно проблему легко решить через tmpfiles.d,то почему бы не сделать? По мне так хорошее решение для дистрибутивов, где есть systemd.

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

Подумай тогда над скриптом-обёрткой, которая будет запускать твой сервис, висеть-ждать его завершения и чистить файлы после его остановки. Это не должно быть сложно сделать и в принципе работать будет.

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

ждать его завершения и чистить файлы после его остановки

Как я написал в самом первом посте, при штатной остановке приложения или сервера всё само подчищается. Проблема возникает при аварийной перезагрузке, когда в ЦОД или в гипервизоре возникают проблемы.

Тогда сервер ребутается аварийно (без остановки ОС), то ничего само не подчищается.

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

Если приложение упало, то скрипт это увидит и подчистит. Также скрипт может монтировать tmpfs при необходимости в любом место без всяких дополнительных сервисов. Т.е. заводишь для своей программы каталог в каком-то месте, например /var/lib/myprogram и внутри него уже делаешь что душе угодно. Ну или просто при вызове скрипта, а-ля старте приложения перед вызовом самого приложения удаляешь из какой-то директории все сокеты и тд, тогда можно без tmpfs обойтись.

Legioner ★★★★★
()

/var/run не подходит, так как там только root может создавать файлы и каталоги.

Создай диру лапками, выстави права на запись нужному пользователю.

/var/tmp – не уверен, что хорошая идея.

Там обычно хранятся временные файлы которые должны пережить ребут. Так что да, это плохая идея.

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

Создай диру лапками, выстави права на запись нужному пользователю.

Я пояснял в самом начале вопроса, что /var/run самоочищается при перезагрузке и всё содержимое, включая созданные файлы, самоликвидируется. То есть придётся каждый раз «лапками» создавать каталоги и назначать права, что нежелательно.

Поэтому остановился на варианте с tmpfiles.d, как предложил shell-script выше.

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

А зачем писать самописные скрипты и тратить своё время на тестирвоание, наладку и написание, если можно воспользоваться советом shell-script с tmpfiles.d? tmpfiles.d явно легче и красивее :-).

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

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

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

/var/run самоочищается при перезагрузке

Дичь какая-то…

Ну создай скрипт который будет делать

#!/bin/sh
mkdir -p /var/run/yourprog
chown -R youruser:yourgroup /var/run/yourprog
chmod 0750 /var/run/yourprog
exec yourprog $*
mord0d ★★★★★
()
Последнее исправление: mord0d (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.