시스템 서비스를 특정 사용자를 통해 실행하고 부팅시 시작하려면 어떻게해야합니까?


132

방금 Ubuntu 서버 14에서 버전 15로 업그레이드했습니다. 업그레이드 후 upstart 스크립트가 작동하지 않고 systemd가 새로운 기본값임을 읽었습니다. 나는 리눅스 전문가와 거리가 멀다. 그래서 나에게 쉽게 가라. :-)

내 시작 스크립트가 이전에 있었던 것입니다 :

description "NZBGet upstart script"

setuid robert
setgid robert

start on runlevel [2345]
stop on runlevel [016]

respawn

expect fork

script
    exec nzbget -D
end script

pre-stop script
    exec nzbget -Q
end script

시스템화 된 wiki 페이지로시작을 기반으로, 새로운 시스템 서비스 파일에서 가능한 한 밀접하게 매핑하기 위해 제공된 테이블을 사용했습니다.

[Unit]
Description=NZBGet Service

[Service]
Type=forking
ExecStart=/usr/local/bin/nzbget -D
ExecStop=/usr/local/bin/nzbget -Q
Restart=on-failure

이 파일은에 있습니다 /home/robert/.config/systemd/user/nzbget.service. 서비스를 수동으로 시작하려면 다음을 수행했습니다.

$ systemctl --user start nzbget

이것은 잘 작동합니다. 그러나 SSH 세션에서 로그 아웃하면 서비스가 종료됩니다. 또한 부팅 또는 사용자 로그인시 시작되지 않습니다. 시동 서비스와 같은 방식으로 작동하기를 원합니다. 부팅시 시작하여 지속적으로 실행하고 특정 사용자로 실행하고 싶습니다.

이 구성을 얻으려면 어떻게해야합니까?

답변:


163

첫 번째 문제

당신은 지시를 지정할 수 있습니다 User=Group=[Service]유닛 파일의 섹션을 참조하십시오.

두 번째 문제

부팅시 서비스를 실행하려면 홈 폴더에 넣지 마십시오. 대신 아래에 넣으십시오 /etc/systemd/system/. 이 폴더는 시스템 관리자 (즉, 사용자)가 새로운 시스템 전체 서비스를 추가하기 위해 사용하는 폴더입니다.

다른 폴더는 다음과 같습니다.

  • /usr/lib/systemd/system/데비안과 우분투에서 폴더가 실제로 불구하고, 유닛 파일을 설치하려는 패키지를위한 것입니다 /lib/systemd/system/다양한 때문에 binlib폴더가 통합에 병합되지 않은 /usr/아직 접두사.
  • /usr/local/systemd/system/ 로컬로 컴파일 된 패키지로 장치를 설치하기위한 것입니다.

단위 테스트

장치 파일이 적절한 위치에 있으면 systemctl start <UNIT_FILENAME>평소와 같이 입력하여 장치를 즉시 시작할 수 있습니다 . 장치의 전체 경로를 입력하지 않아도 작동합니다. 확장자 인 경우 확장자를 지정할 필요도 없습니다 .service.

장치 활성화

장치를 활성화하기 전에 [Install]지시문을 추가해야하는 섹션 을 추가 해야합니다 WantedBy=multi-user.target. 이 지정 문은 서비스를 시작해야하는 부팅 프로세스 단계를 지정합니다 (활성화 된 경우). multi-user.target대부분의 서비스에 적합합니다.

해당 정보가 추가되면을 systemctl enable <UNIT_FILENAME>사용하여 장치를 활성화하여 지금부터 지정된 단계에서 부팅하는 동안 시스템이 자동으로 시작되도록합니다.


이것은 효과가 있었다. systemctl enable명령에 서비스 파일 이름의 절대 경로를 지정해야 했지만 처음에는 명확하지 않았습니다. 또한 활성화하면 누락 된 [Install]섹션 에 대한 경고가 표시 됩니다. 무시했지만 부팅시 시작 기능에 영향을 줄지 잘 모르겠습니다.
void.pointer

2
Install경고는 실제로 정말 중요했다. 섹션 WantedBy=multi-user.target아래에 없으면 부팅시 시작되지 않습니다 [Install]. 받는이를 추가 한 후 .service, 파일을 다음 을 수행 할 수 있습니다 enable그것을.
void.pointer

4
답변을 오랫동안 방치 해 두는 것에 대해 사과드립니다. 단위 파일이 있어야 할 위치를 수정하고 [Install]섹션 에 대한 누락 된 정보를 추가했습니다 . 그것이 그것을 찾는 사람에게 더 도움이되기를 바랍니다.
Yamaho 2019

5
이것은 사용자 이름이 템플릿 화 될 때 훨씬 쉬워집니다. 즉, 서비스가 파일 이름 형식으로 정의 된 something@.service다음 설정 enable과 같이 d 는 사용자가 하드 코딩되지 않았으며 여러 사용자가 동일한 정의를 사용할 수 있음을 의미합니다. 예입니다. something@username.serviceUser=%i
Walf

1
아래에 놓으면 시작 /etc/systemd/user/됩니까?
Khurshid Alam

46

systemd의 "사용자 대기"기능 사용에 관심이있을 수 있습니다. 를 통해 활성화됩니다 loginctl enable-linger USERNAME.

부팅시 각 ​​사용자에 대해 별도의 서비스 관리자가 시작되므로 ~/.config/systemd/user서비스 구성에 따라 부팅 및 종료시 사용자 정의 단위 가 선택되어 처리됩니다.

또한 systemctl --user서비스를 관리하고 구성하는 데 사용할 수 있으며 ,이 서비스는 시스템이 아닌 사용자의 서비스 관리자에서 작동합니다.


6
systemctl --user환상적인 발견입니다. 감사!
Anwar

@byteborg 어쩌면 unix.stackexchange.com/questions/409900/…에 기여할 수 있습니까 ? 사용자 느린 서비스에서 PostgreSQL에 대한 종속성이 필요하지만 데이터베이스는 사용자가 아닌 시스템 서비스로 남아 있습니다.
Michał F

1
서비스가 실행되면 사용자가 서비스 로그를 볼 수있는 기술이 있습니까? 권한이없는 사용자는 / var / log / syslog에 접속할 수 없습니다.
mpr

2
참고 systemctl --user하지만 SSH 세션에 대해 작동하지 않습니다.
Mark K Cowan

2
허용되는 솔루션이어야 함
Drew
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.