systemd는 시작 후 깨끗한 터미널에서 실행 중인 프로그램을 자동으로 열 수 있습니까?

systemd는 시작 후 깨끗한 터미널에서 실행 중인 프로그램을 자동으로 열 수 있습니까?

우선 간단한 질문에 대해 사과드립니다. 아래에서 더 자세히 설명하겠습니다.

저는 Linux 스타일 시스템을 처음 접했고 분명히많은공부하다.

이렇게 넣어보세요...

내 시스템

저는 Raspberry Pi 4 Model B에서 프로그램을 실행하고 있습니다. 내 운영 체제는 Raspbian GNU/Linux 10(buster)입니다.

내가 소유한 것

. home/pi/Dev​프로그램은 무한 반복됩니다(빈 for루프 사용).

Geany(pi의 편집기)를 통해 프로그램을 시작하면 새 터미널 창을 열고 거기에서 출력을 인쇄하는 프로그램을 만들고 실행할 수 있습니다.

폴더에서 실행 파일을 클릭하면 "실행"과 "터미널에서 실행" 중에서 선택하라는 메시지가 표시됩니다.

  • "실행"을 선택해도 아무런 효과가 없는 것 같습니다. (작업관리자에서 프로세스를 찾아보니?)

  • "터미널에서 실행"을 선택하면 오류가 발생합니다.Failed to execute child process “xterm” (No such file or directory)

터미널을 사용하고 ./myprogram프로그램이 실행되는 동안 프로그램을 실행하여 열려 있는 터미널 창에 출력을 인쇄합니다.

내가 원하는 건

프로그램이 시작될 때 자동으로 실행되도록 하고 싶습니다.

Pi는 "헤드리스"로 사용되지만 그래픽 인터페이스가 활성화되어 VNC를 사용하여 데스크탑을 볼 수 있습니다. VNC 연결을 열 때 터미널이 실행되어 프로그램 출력을 표시하기를 원합니다.

내가 시도한 것

나는 프로그램을 시작하기 위해 systemd를 사용하려고 노력해 왔습니다.

처음에는 프로그램을 직접 시작하려고 했지만 온라인에서 좋은 정보나 예제를 찾을 수 없었습니다. 대부분의 예제는 bash 또는 Python 스크립트를 사용했습니다... 이길 수 없다면 참여하세요. ..

다음으로 usr/local/bin/에 다음과 같은 간단한 bash 스크립트를 생성(복사)했습니다 procamStartup.sh.

#!/bin/bash
echo test
cd /home/pi/Dev/
./Procam

를 사용하여 이 스크립트를 실행하면 ./procamStartup.sh터미널에 "test"가 인쇄되고 그 아래에 프로그램이 인쇄되기 시작합니다. 그래서 제 눈에는 스크립트가 유효합니다.

다음으로 다음과 같은 파일을 만들었습니다 service./etc/systemd/system/procamStartup.service

[Unit]
 Description=Procam Startup Script
 After=graphical.target

 [Service]
 Type=idle
 ExecStart=/usr/local/bin/procamStartup.sh

 [Install]
 WantedBy=graphical.target

Type = idle시작하기 전에 시스템이 모든 프로세스가 완료될 때까지 기다리도록 선택합니다 .

WantedBy=graphical.target그래픽 인터페이스가 시작된 후에만 프로그램이 시작되도록 선택했습니다 .

다음 명령을 사용하여 스크립트 및 서비스 폴더에 대한 실행 권한을 설정했습니다.

  • sudo chmod +x /usr/local/bin/procamStartup.sh

  • sudo chmod +x /etc/systemd/system/procamStartup.service

다음으로 systemd에 파일을 다시 로드하라고 지시합니다.

sudo systemctl daemon-reload

그런 다음 시작 시 스크립트가 실행되도록 활성화합니다.

sudo systemctl enable procamStartup.service

그리고 나는 도망쳤다 sudo reboot.

계속하다

그래서..이 게시물을 보내기 전에 나는 내 지시에 따라 다음을 실행했습니다.

sudo systemctl status procamStartup.service

서비스가 성공적으로 실행되었음을 보고하고 프로그램 출력을 로그에 인쇄합니다.

이것은 잘 작동합니다. 프로그램이 실행되는 동안 예상대로 Pi를 사용할 수 있습니다. 기본적으로 출력이 표시되지 않습니다.

내 질문을 다시 실행하세요.

systemd는 시작 후 깨끗한 터미널에서 실행 중인 프로그램을 자동으로 열 수 있습니까?

또한 프로그램을 실행하는 스크립트를 실행하기 때문에 서비스 파일을 변경해야 한다고 생각합니다. 동일한 프로그램의 여러 인스턴스를 시작하게 될 수도 있습니다.

읽어 주셔서 감사합니다.

계속하다

지금 설치했어요xterm

스크립트를 다음과 같이 변경했습니다.

#!/bin/bash
xterm -hold -e /home/pi/Dev/Procam

Pi GUI 터미널을 통해 이 스크립트를 실행하면 원하는 결과를 얻을 수 있습니다. 올바른 출력이 포함된 새 창이 나타납니다.

부팅이나 SSH를 통해 이를 실행하면 다음 오류가 발생합니다.

xterm: Xt error: Can't open display: %s

xterm: DISPLAY is not set

현재 이 문제에 대한 해결책을 찾기 위해 노력하고 있습니다.

답변1

원하는 기능을 얻을 수 있게 되었습니다.

/usr/local/bin/( )의 스크립트를 편집했는데 procamStartup.sh이제 다음과 같이 표시됩니다.

#!/bin/bash
DISPLAY=:0 xterm -hold -e /home/pi/Dev/Procam

그리고 /etc/systemd/system/( ) procamStartup.service의 서비스 파일을 다음과 같이 편집합니다 .

[Unit]
 Description=Procam Startup Script
 After=graphical.target

 [Service]
 Environment=XAUTHORITY=/home/pi/.Xauthority
 DISPLAY=:0
 User=pi
 Type=idle
 ExecStart=/usr/local/bin/procamStartup.sh
 User=pi
 Environment=XAUTHORITY=/home/pi/.Xauthority

 [Install]
 WantedBy=graphical.target

sudo systemctl daemon-reload다시 로드 한 후 sudo reboot이제 VNC에 연결되어 자체 터미널 창에서 프로그램이 실행되는 것을 볼 수 있습니다.

금요일에 좋은 소식이네요 :)

좋은 주말 보내길 바래!

관련 정보