추가 읽기

추가 읽기

systemctl --user데스크톱 사용자에게는 잘 작동하는 것 같습니다.

dev@dev-VirtualBox:~$ systemctl --user > /dev/null
dev@dev-VirtualBox:~$ echo $?
0

하지만 www-data 사용자로 동일한 명령을 실행할 때 예상치 못한 응답을 받았습니다.

dev@dev-VirtualBox:~$ sudo su www-data -s /bin/bash
www-data@dev-VirtualBox:~$ systemctl --user > /dev/null 
Failed to connect to bus: No such file or directory 
www-data@dev-VirtualBox:~$ echo $? 
1

여기서 어떻게 활성화하나요 systemctl --user?

우분투 16.04 실행

답변1

이것사용자 인스턴스당systemd는 로그인 프로세스(PAM)의 Hook을 통해 시작되며 pam_systemd일반 가상/실제 터미널 로그인과 SSH 등을 통한 원격 로그인에 사용됩니다.

로그인하지 않으셨습니다. 특권을 강화하고 있습니다.기존 로그인 세션그리고 sudo su www-data. (그런데 이것은 중복됩니다. 슈퍼유저로 명령을 실행할 필요 없이 sudo -u www-data바로 시작됩니다 www-data.) 아직 후크를 호출하지 않았습니다.

따라서 www-datasystemd의 사용자별 인스턴스는 아직 시작되지 않았으며 systemctl --user대화할 항목을 찾을 수 없습니다.

수동으로 시작할 수 있습니다.

%sudo install -d -o www-data /run/user/`id -u www-data`
% sudo systemctl start user@`id -u www-data`

(잘못된 순서로 수행한 경우 서비스를 중지하고 올바른 순서로 실행하십시오. 잘못된 순서로 실행하면 결국 빈 런타임 디렉토리가 발생하고 D-Bus 및 기타 소켓 파일이 누락되지만 서비스는 실행 중입니다. 클라이언트와 절대 통신하지 않습니다).

한 가지 까다로운 점은 다른 계정의 권한으로 데스크톱 버스 클라이언트 프로그램을 실행할 때 다른 계정의 데스크톱 버스 에이전트와 통신할 수 DBUS_SESSION_BUS_ADDRESS있도록 변수를 변경해야 한다는 것입니다.systemctl

% sudo -u www-data DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/`id -u www-data`/bus systemctl --user

이것이 쉬운 방법입니다. 보다 정교한 접근 방식은 후크가 sudo호출 되도록 PAM 구성을 조정하는 것입니다 pam_systemd. 그러나 XDG_RUNTIME_DIR특히 환경 변수와 관련하여 원하지 않는 부작용이 있을 수 있습니다. 발생한 효과를 견딜 수 있다고 확신하는 경우 에만 이 pam_systemd대안을 시도하십시오 sudo.

추가 읽기

답변2

그래서 마침내 잃어버린 퍼즐 조각을 찾았습니다. @JdeBP의 훌륭한 팁 덕분에 다음 사항을 확인할 수 있었습니다.

  • systemd --user가 www-data를 위해 실행 중입니다.
  • 우분투에서는 DBUS_SESSION_BUS_ADRESS가 무시되는 것 같습니다.
  • XDG_RUNTIME_DIR이 설정되지 않았습니다.

"/run/user/$UID"를 내보내도록 XDG_RUNTIME_DIR을 설정하면 문제가 해결되었습니다.

예상되는 동작을 얻기 위해 따라야 할 단계는 다음과 같습니다.

% sudo loginctl enable-linger www-data # Enable systemd --user service to start at boot
% XDG_RUNTIME_DIR="/run/user/$UID" systemctl --user # Access services as www-data without actually logging in

답변3

이것은 매우 추악한 해결 방법입니다.

말했듯이 질문은 다음과 같습니다.

로그인하지 않으셨습니다. 기존 로그인 세션의 권한을 강화하고 있습니다 [...]

그러니 "그냥" 로그인하세요...

서버에 있는 경우 터미널을 사용해야 합니다. 같은 질문을 해야겠어요, 그러나 마침내 발견했습니다. 해결책은 매우 간단합니다. 다음 명령을 실행하여 사용자로 전환하면 됩니다(각각 해당 사용자로 적절한 셸을 실행).

$ sudo machinectl shell --uid www-data

sudo loginctl enable-linger www-data부팅 시 실행되도록 서비스 등을 시작하려는 경우에도 여전히 유용합니다. 그렇지 않으면 해당 사용자가 "로그인"된 경우에만 실행됩니다.

답변4

에서 언급했듯이여기에 댓글이 있습니다.systemctl, 사용자로 실행할 수 있는 관련 Ubuntu 패키지가 누락되었을 수 있습니다. 나에게 일어난 일입니다. 수리하다:

  1. apt install libpam-systemd

  2. 실행할 수 있어야 하는 사용자로 SSH를 통해 다시 로그인합니다 systemctl --user. 따라서 루트로 수행하지 마십시오.

이제 echo $XDG_RUNTIME_DIR추가 단계 없이 작동하며 다음과 같이 표시됩니다.

$ echo $XDG_RUNTIME_DIR
/run/user/1012

우분투 18.04 LTS가 출시되었습니다.

관련 정보