Ты спрашиваешь:
Является ли / var / run / user / $ UID новым / var / run для файлов PID?
Короткий ответ - нет".
И длинный ответ по-прежнему «нет».
Или сказать это громко и ясно: традиционные файлы PID не должны идти ниже/run/user/$UID/
(AKA /var/run/user/$UID/
). Храните их в обычном режиме /run/
или /run/package/
как обычно, так как это /run/user/$UID/
служит совершенно другой цели для сервисов сеансов.
FYI:
Как отмечает @Daniel B,
/var/run
сегодня это мягкая ссылка, на которую указывает/run
. Это не является специфическимsystemd
и может быть найдено в большинстве систем сегодня. Если вы хотите оставаться совместимым со старыми системами, есть два решения: либо оставайтесь с,/var/run/
а не/run/
, или попросите кого-нибудь создать мягкую ссылку/run
, указывающую/var/run
на такие старые системы.Также обратите внимание, что
/run/user/$UID/
это характерно для работающих системsystemd-logind
. Также это не поддерживается на старых системах.
Чтобы вдаваться в подробности для тех, кто еще не знает:
Существует 3 вида услуг: системные сервисы, пользовательские сервисы и сервисы сеансов. Все 3 типа могут работать в фоновом режиме или на переднем плане, так что это дает 6 вариантов.
Традиционные сервисы системы Foreground были запущены /etc/inittab
, в настоящее время systemd
они запускаются через /etc/init/
. Системные службы Foreground обычно не нуждаются в файлах PID, так как они контролируются init
, и могут вызываться в случае сбоя.
Фоновые системные службы традиционно запускались сценариями уровня запуска /etc/rc.d/
. Обычно им нужны PID-файлы, потому что они работают в фоновом режиме, поэтому нет никакого контроля над тем, работают они или нет. PID-файлы очень подвержены ошибкам (поскольку нет гарантии, что PID останется свободным после прекращения работы службы) и используются для повторного поиска запущенных служб, когда rc-скрипт должен завершить работу службы. Эти файлы PID традиционно жили /var/run
и в настоящее время живут /run/package/
(или, если в пакете есть только один файл /run/package.pid
).
Пользовательские сервисы - это сервисы, которые запускаются пользователем и должны жить вне сеанса пользователя. Например, сервер Minecraft или что-то вроде долгоживущего процесса запроса SAP, который запускается по требованию с помощью кратковременного сеанса. Они немного отличаются от системных служб, поскольку не могут их использовать /run/
. Вместо этого их нужно использовать /tmp/
или какой-нибудь каталог ниже $HOME
(что проблематично, если $HOME
это сетевой ресурс, общий для нескольких компьютеров).
Пользовательские службы Foreground иногда немного проблематичны, потому что они часто нужны tty
, поэтому, если пользователь выходит из системы, он прекращает работу. Следовательно, существует множество способов оставить их в живых после того, как пользователь ушел, например nohup
или screen
. Но могут быть даже такие экзотические варианты, как socat tcp-connect:host:port exec:service.sh,pty
.
Другим вариантом приоритетных пользовательских услуг являются задания cron, которые живут в crontab
пользовательской среде. Однако эти cronjobs также могут быть фоновыми службами, например, если они не должны работать параллельно, даже если один процесс превышает время, когда выполняется следующий вызов cron.
У фоновых пользовательских сервисов та же проблема, что и у фоновых системных сервисов, поскольку они должны отслеживать, какая из них уже запущена, и контролировать уже запущенные. В прошлом это приводило к различным проблемам и исправлениям для таких вещей, как атаки через каталоги и тому подобное, из-за необходимости использовать, /tmp
где каждый может создавать файлы и каталоги.
Однако это еще не изменилось, поскольку /run/user/$UID/
не предназначено для таких пользовательских услуг. Он был разработан для решения еще более сложной проблемы со службами сеансов.
Служба сеанса - это служба, которая обычно запускается при входе пользователя в систему и останавливается при выходе пользователя из системы. Это звучит просто, но набирает обороты, если для одного пользователя разрешено более одного сеанса. Трудный вопрос, который нужно решить: «когда сессия действительно заканчивается»?
Сессия начинается с первого входа в систему. Это легко понять. Но это не обязательно заканчивается, когда этот логин выходит из системы! Таким образом, сервис сеанса может быть запущен при первом входе в систему (или позже), но довольно часто необходимо продолжать работать до тех пор, пока не выйдет последний сеанс пользователя.
Услуги переднего плана обычно являются простым вариантом. Как dbus
сервис X-Window, который запускается и заканчивается графическим логином. Но если вы начнете печатать гигантский PDF-файл, вы наверняка захотите, чтобы эта работа была либо успешно завершена, либо полностью завершена без остатков мусора, верно?
Сервисы сеансов такого типа либо должны продолжать работать в фоновом режиме, либо должен быть какой-то способ очистки после сбоя службы, если что-то неожиданно умирает. И вещи часто умирают в нашем мобильном мире. Подумай о своем мониторе. Вы можете подключить и отключить монитор в любое время. Нет необходимости перезагружать компьютер. Но что произойдет, если вы отключите все экраны? Ну, X11 умирает, конечно. Для некоторых пользовательских служб, запущенных в сеансе X11, это происходит неожиданно, возможно, в середине более длительной задачи.
Здесь /run/user/$UID/
пригодится, так как этот каталог стирается автоматически после завершения последнего сеанса пользователя. Таким образом, службы могут доверять тому, что за пользователем будет происходить очистка всего, что хранится в /run/user/$UID/
!
Таким образом, все связанные с сеансами службы должны использовать этот каталог.
Также обратите внимание, что у нас dbus
сегодня. Таким образом, вам больше не нужно полагаться на PID-файлы, чтобы узнать, запущена какая-либо служба или нет. Это особенно верно для сервисов сессий, поскольку существует нечто, называемое «сессия», которое позволяет вам обрабатывать вещи немного лучше, например, использовать сегменты общей памяти или блокировать файлы, в которых можно жить /run/user/$UID/
.
Вещи не легко. И, чтобы сделать его еще более сложным, есть такие вещи, как screen
, tmux
или ssh
(тот, кто разветвляется от оболочки), у которых есть две стороны, одна сторона - это пользовательская служба (т.е. демон), другая сторона - это служба сеанса. (tty). Хотя они обычно связаны с сеансом, это не обязательно должно происходить постоянно. Например, если вы используете ssh
переадресацию портов и выходите из своей оболочки, ssh
остается открытым, пока не будет закрыт последний переадресованный порт. Вы можете даже открыть новые порты, пока некоторые другие остаются активными. В случае такого «двойного» сервиса может пригодиться что-то вроде файла PID, и в этом случае он даже может жить /run/user/$UID/
.
(Обратите внимание, что cron
его можно использовать для открытия пользовательского сеанса, поэтому, вероятно, /run/user/$UID/
он доступен и для cronjobs. Но если это так, он /run/user/$UID/
снова получает право на очистку после завершения всех cronjobs. Это, возможно, означает, что файлы, которые были переданы, исчезают в другом месте, в отличие от того, где они живут /tmp/
, так как только перезагрузка должна безоговорочно удалять файлы там.)
Подвести итог:
Если у вас есть правильно спроектированная служба, вам никогда не понадобятся простые PID-файлы /run/user/$UID/
, потому что службы сеансов (единственные, использующие этот каталог) обычно имеют более удобный способ (сеанс), чтобы сохранять контроль, даже если они работают в фоновом режиме. ,
Так что, если вы обнаружите необходимость использования PID-файла для вашей службы, очень вероятно, что вы получите что-то вроде /run/package/
, /run/package.pid
или /tmp/package-$UID/
.
Используйте, только /run/user/$UID/
если вы хотите убедиться, что файл исчезнет, как только пользователь полностью выйдет из системы. Также обратите внимание, что root
пользователь не всегда вошел в систему, поэтому, скорее всего, нет /run/user/0/
.
И, пожалуйста, никогда не создавайте каталоги прямо под /run/user/
собой!
Надеюсь, теперь все так хорошо и понятно. Но мне есть что признаться
Я соврал тебе. И я сделал это остроумно (но без злого умысла).
Поскольку сессия ( systemd-logind
с точки зрения России) не просто связана с login
. Да, что-то похожее login
, конечно, задействовано, но все немного сложнее:
https://dvdhrm.wordpress.com/2013/08/24/session-management-on-linux/
Тем не мение:
Для этой публикации здесь (короткая, но неправильная история) ответом на ваш вопрос будет «нет».
К счастью, с длинными (и верными) сведениями о сессиях (см. Ссылку), ответ по-прежнему остается «нет».
Только в некоторых очень редких и очень особых случаях для очень четко определенной цели вы можете рассмотреть возможность размещения вашего файла PID
/run/user/$UID/
.
Хорошего дня.