GUI 응용 프로그램을 시작하기 위해 SystemD에서 호출하는 Bash 스크립트

GUI 응용 프로그램을 시작하기 위해 SystemD에서 호출하는 Bash 스크립트

여기서 뭔가 잘못하고 있습니다. SystemD가 bash 스크립트를 실행하길 원합니다. bash 스크립트는 GUI 응용 프로그램이 실행 중인지 확인하고, 그렇지 않은 경우 bash 스크립트는 GUI 응용 프로그램을 시작합니다. GUI 응용 프로그램이 실행 중이면 bash 스크립트가 종료됩니다.

bash 스크립트 를 수동으로 실행할 수 있지만 systemctl --user start make-run.sh.xterm차테리노. xterm대부분의 사람들이 Chatterino를 사용하지 않는다고 가정하기 때문에 로 변경했습니다 . Bash 스크립트는 실행 가능합니다. 내 유닛 파일은 에 있습니다 ~/.config/systemd/user/. 또한 Type=oneshot유닛 파일에서 시도했지만 성공하지 못했습니다.

배쉬 스크립트

#!/bin/bash
# ensure a process is always running

export DISPLAY=:0 # needed if running a gui app

process=xterm
makerun="/usr/bin/xterm"

if ps ax | grep -v grep | grep $process > /dev/null
then
    exit
else
    $makerun &
fi

exit

유닛 파일

[Unit]
Description=Make run

[Service]
Environment="DISPLAY=:0"
ExecStart=/usr/bin/bash /home/ladlelord/bin/make-run.sh

[Install]
WantedBy=graphical.target

답변1

GAD3R은 가깝지만 다음을 권장합니다.

  1. DISPLAY전혀 설정하지 마십시오. 버스는 --user이를 암시적으로 설정합니다. 전혀 설정하지 않으면 디스플레이 설정을 변경하고 결국 다른 모니터에 로그인하더라도 계속 작동할 수 있습니다. 즉, DISPLAY서비스와 스크립트에서 이러한 줄을 제거합니다.
  2. [Install]섹션 에서는 graphical-session.target이 사용자를 위한 그래픽 환경을 준비한 후 . 일반적인 부적절한 오류는 다음과 같습니다.
    • graphical.target시스템 버스에서만 발생하며 로그인 화면(예: GDM 또는 lightdm)이 나타날 때 발생합니다. GUI 사용자 응용 프로그램을 시작하기에는 너무 이르습니다.
    • multi-user.target또한 시스템 버스에서도 발생하며, 누구나 로그인할 수 있게 되자마자 발생합니다(Ssh 또는 TTY를 통한 경우 포함). 물론 이는 사용자가 로그인했거나 그래픽 환경을 사용할 수 있다는 보장이 없기 때문에 부적절합니다.
    • default.target사용자 버스에 있지만 SSH를 통해(그래픽 세션 없이) 로그인한 경우 오류가 발생할 수 있습니다. 어떤 경우에는 서비스가 실패할 수 있습니다.
  3. xterm사용자에 관계없이 실행 중인 인스턴스가 없으면 스크립트가 실행됩니다. 이로 인해 다소 불필요해지며 실제로는 어떤 작업도 수행하지 않고 서비스가 즉시 종료될 수 있습니다(서비스를 시작할 때 원하는 것이 아닐 수도 있음). 스크립트를 제거하고 ExecStart=/usr/bin/xterm.
  4. 스크립트를 실제로 보존하려면 Type=forking대신 암시적 사용을 고려하십시오 Type=simple. 을 실행하면 bash시작되고 xterm종료됩니다. 때문에 Type=simple, bash그것은 주요 프로세스입니다. bash종료 되면 systemd기본 프로세스가 종료되는 것으로 표시되며 서비스는 완료된(비활성-비활성) 것으로 간주되어야 합니다. 그런 다음 를 포함하여 고아 프로세스 를 모두 정리(종료) 합니다 xterm. 기본 프로세스가 되는 생성 프로세스를 명시적으로 정의하는 데 사용할 수 있습니다. 그러나 그것이 당신이 하는 전부라면 이 모든 것은 불필요합니다 .Type=forkingsystemdPIDFile=ExecStart=/usr/bin/xterm

내 전체 제안은 다음과 같습니다(스크립트를 제거한다고 가정).

[Unit]
Description=Make run

[Service]
ExecStart=/usr/bin/xterm
Restart=on-failure

[Install]
WantedBy=graphical-session.target

또는 다음과 같습니다(스크립트 사용).

[Unit]
Description=Make run

[Service]
ExecStart=/usr/bin/bash /home/ladlelord/bin/make-run.sh
Restart=on-failure
Type=forking

[Install]
WantedBy=graphical-session.target

답변2

Bash 스크립트에서 export DISPLAY=:0다음으로 바꾸십시오.

export DISPLAY=:0.0

다음과 같이 편집되었습니다 make-run.sh.service:

[Unit]

Description=Make run

[Service]
Environment="DISPLAY=:0"
ExecStart=/usr/bin/bash /home/ladlelord/bin/make-run.sh
Restart=on-failure
Type=forking

[Install]
WantedBy=graphical.target

그 다음에:

systemctl --user daemon-reload
systemctl --user restart make-run.sh.service

편집하다

graphical.target 다음 상황에 따라 더 적합합니다.@스튜어트 제안.

관련 정보