Как запустить pm2, чтобы другие пользователи сервера могли получить доступ к процессу?

Когда я запускаю приложение Nodejs с помощью pm2, другие пользователи сервера не могут получить доступ к процессу.

Даже если я запускаю pm2 из настраиваемого каталога (не текущего пользователя ~/, то, что pm2 использует по умолчанию):

HOME=/var/www pm2 start app.js

Каталог доступен для любого пользователя (по сравнению с ~/, но другой пользователь сервера по-прежнему не может получить доступ к процессу.

Когда другой пользователь сервера делает pm2 list, он показывает, что запущено 0 процессов, но они есть (запущены другим пользователем). И когда другой пользователь пытается HOME=/var/www pm2 list, CLI выдает ошибку:

events.js:72
    throw er; // Unhandled 'error' event
          ^
Error: connect EACCES
    at errnoException (net.js:905:11)
    at Object.afterConnect [as oncomplete] (net.js:896:19)

Итак, мне интересно, как убедиться, что пользователи могут получить доступ к процессам pm2, запущенным другими пользователями сервера? Или надо подходить иначе?


Мне интересно, почему каждый пользователь сервера может заставить git pull развернуть последний исходный код из репозитория Git, но не может после этого перезапустить pm2 процесс? Только пользователь, запустивший pm2 процесс, может его перезапустить… Странно.


person Nik Sumeiko    schedule 24.08.2015    source источник
comment
Один экземпляр pm2 принадлежит только тому пользователю, который его запустил.   -  person soyuka    schedule 25.08.2015
comment
@Nik Sumeiko, согласно описанию нельзя добавлять в этот пост тег forever.   -  person Rayyan    schedule 06.04.2021


Ответы (6)


Вот как мы это обошли.

Просто создайте группу

  • Создайте новую группу pm2 или любое другое название, которое вам подходит

    $ groupadd pm2

  • Измените /var/www/ владельца группы папок на группу pm2

    $ chgrp -R pm2 /var/www

  • Добавьте другого пользователя, скажем, Боба, в pm2

    $ usermod -aG pm2 bob

Теперь Боб может запускать команды pm2, изменив $ HOME на / var / www.

$ env HOME=/var/www pm2 list

Или (еще лучше) создайте псевдоним, как предложил @jcollum

$ alias pm2='env HOME=/var/www pm2'

person vinayp    schedule 07.10.2015
comment
Это сработало для меня. Другой способ - присвоить псевдоним PM2, чтобы env HOME был включен во все вызовы pm2. - person jcollum; 28.01.2016
comment
Извините за вопрос новичка. В приведенном выше решении - если пользователь bob запускает что-то с pm2 (например, список pm2), он изменит его переменную HOME. Только для этой команды, иначе она будет постоянной (в этом случае это не лучшее решение, потому что многие приложения запрашивают эту переменную HOME). - person JanezKranjski; 17.06.2019
comment
У меня точная проблема, но я с сервера Windows, может ли кто-нибудь сообщить мне, как сделать эквивалент в среде Windows? - person jet_choong; 14.11.2019
comment
@JanezKranjski: каждое приложение в Linux запускается как пользователь и далее в среде. Вам нужно будет установить ENV для пользователя, запускающего приложение. Надеюсь, это имеет смысл. - person vinayp; 18.05.2020
comment
@JanezKranjski обратите внимание на способ запуска команды: env HOME = / var / www pm2 перечислить все в одной строке. Указание переменной env в той же строке перед запуском команды устанавливает, что env var локально для этой команды. Поэтому, когда это будет выполнено, $ HOME вернется к своему исходному значению. Фактически, технически стоимость никогда не менялась. - person Brendan Quinn; 02.06.2021

Хорошо, вот мое решение той же проблемы:

# 1. Create user PM2 and set his password
sudo useradd -d /opt/pm2 -m -s /bin/bash pm2
sudo passwd pm2

# 2. Add users you want to provide the access to PM2 to PM2 group
sudo usermod -aG pm2 <username>

# Note: if you added yourself to pm2 group, perform logout and login back to the host machine   

# 3. Set the PM2_HOME variable
sudo touch /etc/profile.d/pm2.sh
sudo sh -c 'echo "export PM2_HOME=\"/opt/pm2/.pm2\"" > /etc/profile.d/pm2.sh'
source /etc/profile.d/pm2.sh

# 4. Install the PM2 
# Check the npm prefix if fail: 
# https://docs.npmjs.com/misc/config#prefix
sudo npm install pm2 -g

# 5. Make startup script
sudo pm2 startup ubuntu -u pm2 --hp /opt/pm2

sudo systemctl enable pm2-pm2 && \
sudo systemctl start pm2-pm2 && \
sudo systemctl status pm2-pm2

# 6. Change permission of PM2_HOME
sudo chmod -v g+w /opt/pm2/.pm2

# 7. Check the PM2
pm2 status
person Ilja Denisovs    schedule 11.09.2016
comment
Нужно ли задавать переменную PM2_HOME перед установкой? Я уже установил pm2 и хотел бы избежать повторной установки ... - person Mark Nielsen; 15.11.2016
comment
Вы можете установить его в любое время, Марк. Он просто указывает на домашний каталог PM2. - person Ilja Denisovs; 04.12.2016
comment
Единственная проблема, которую я обнаружил, каждый раз, когда сервис pm2 перезапускается, он перезаписывает ОЧЕНЬ важные файлы pub.sock и rpc.sock, и вы теряете установленный вами доступ 770. Эти файлы необходимо изменять при каждом перезапуске. - person Nicholi; 22.09.2017
comment
Лучшее решение для меня! - person Max Liashuk; 14.11.2017
comment
Решение @Nicholi Umask вам не помогло? Вы выполняли некоторые операции PM2 с помощью sudo? Под какой ОС / дистрибутивом (Windows, Ubuntu, Raspbian, что-то еще) работает yout PM2? - person Ilja Denisovs; 06.12.2017

Кажется, что PM2 сохраняет данные в папке пользователя «~ / .pm2», поэтому другие пользователи не могут видеть ваш процесс PM2 со статусом pm2.

Я создал нового пользователя linux для PM2, и все пользователи используют su pm2user перед запуском процесса Pm2:

$ sudo su pm2user
$ sudo pm2 start app.js

Глупый способ, но он простой и хорошо работает. Надеюсь, это поможет :)

person Allen Kung    schedule 24.03.2016

Предполагая, что вы запускаете pm2 как www-data. Чтобы получить доступ к этому экземпляру pm2, я делаю: sudo -u www-data HOME=/var/www pm2 list, например. Вы, конечно, можете создать сценарий (например, supm2), который сделает это за вас, чтобы вместо этого вы могли просто сделать supm2 list.

person Diego Luces    schedule 27.04.2016

Я столкнулся с подобной проблемой. Причина может заключаться в том, что у вас нет необходимых разрешений или вы не владеете файлами pid и sock, созданными pm2. В моем случае он работал нормально, когда я запускал pm2 из командной строки вместо запуска. Когда я использовал автозагрузку, он по умолчанию работал как пользователь root. Итак, root был владельцем pid, sock файлов

person Shrinath Shenoy    schedule 28.08.2015
comment
Шринат, что вы имеете в виду, говоря о запуске pm2 из стартапа? Запуск сервера? Я всегда запускаю pm2 из интерфейса командной строки, но не как пользователь root. Однако как пользователь, находящийся в группе sudoers. - person Nik Sumeiko; 28.08.2015
comment
Может быть, тогда есть способ изменить права доступа к pid, sock файлам? Значит, у других пользователей (sudoers, если это важно) есть разрешение на просмотр запущенных процессов pm2? - person Nik Sumeiko; 28.08.2015
comment
Я хочу сказать, что пользователь, которому во время работы выдается сообщение об ошибке, не имеет разрешения на доступ к pid-файлам pm2. Pm2 запущен другим пользователем - person Shrinath Shenoy; 31.08.2015

Я знаю, что опаздываю на вечеринку, но я сделал это так:

PM2="/usr/share/nodejs/pm2"
USER="me"
useradd $USER
groupadd pm2
chgrp -R pm2 $PM2
usermod -aG pm2 $USER
setfacl -Rdm g:pm2:rwx $PM2

/etc/bash.bashrc и т. д.

export PM2_HOME=$PM2;
person crankshaft    schedule 20.05.2019