`at`이 GUI 애플리케이션을 실행하지 않는 이유는 무엇입니까?

`at`이 GUI 애플리케이션을 실행하지 않는 이유는 무엇입니까?

gedit내 Ubuntu 20 데스크탑에서 지금부터 실행할 계획이지만 아무 일도 일어나지 않습니다. 왜 그런 겁니까?

$ echo "echo foo > at.sux" | at now + 1
warning: commands will be executed using /bin/sh
job 8 at Tue Jun  2 21:47:00 2020

$ echo `which gedit` | at now + 1
warning: commands will be executed using /bin/sh
job 9 at Tue Jun  2 21:47:00 2020

$ atq
9   Tue Jun  2 21:47:00 2020 a dandv
8   Tue Jun  2 21:47:00 2020 a dandv

# A minute later

$ cat at.sux
foo

$ ps auxf | grep gedit  # nothing but grep

$ `which gedit`  # launches gedit

echo "gedit &" | at now + 1댓글에 제안된 대로 시도했지만 1 gedit분 후에도 여전히 실행되지 않습니다.

답변1

GUI 애플리케이션은 서버를 통해 화면에 액세스합니다. 환경은 애플리케이션을 명령줄이나 메뉴에서 실행할 때 서버에 연결하는 방법을 알려줍니다.

그러나 명령을 실행하면 at환경에 해당 정보가 포함되지 않으므로( at -c JOBNUMBER애플리케이션이 상속하는 환경을 볼 수 있음) 애플리케이션이 시작되지만 실행되지 않습니다.

GUI 애플리케이션을 실행하려면 서버를 지정하거나 다음을 사용하여 애플리케이션을 호출할 수 있습니다(표시는 다를 수 있음).

DISPLAY=:0 application

또는 애플리케이션에 따라 다음과 같습니다.

application --display :0

서버 권한을 변경해야 할 수도 있고 세션 외부에서 액세스할 수 없는 다른 서비스(예: dbus)가 필요할 수도 있습니다.

답변2

예를 들어 GUI 응용프로그램은 gedit이 명령으로 작동할 수도 있고 작동하지 않을 수도 있습니다 at. 이는 X11 기반 디스플레이 서버(예: )를 사용하는지 Xorg아니면 프로토콜 기반 디스플레이 서버 Wayland(예: Weston.

사용할 디스플레이 서버는 배포판, 배포판 버전 및 사용자 구성에 따라 다릅니다. 예를 들어 Ubuntu 20은 기본적으로 X11 기반 디스플레이 서버를 사용하는 반면 Fedora 32는 Wayland를 사용합니다.

at명령은 현재 환경의 대부분을 .NET Framework at에 저장합니다 /var/spool/at. DISPLAY, TERM, SHELLOPTS, EUID, GROUPS, PPID, UID 등을 포함한 몇 가지 예외가 있습니다. 이는 at작업 파일에 구체적으로 저장되지 않습니다.

at따라서 X11 기반 서버 환경에서 GUI 응용 프로그램을 시작하기 위한 작업을 생성하면 DISPLAY사용 가능한 변수가 없기 때문에 실패하게 됩니다.

해결책은 간단합니다(화면이 다음과 같다고 가정 :0).

$ echo 'DISPLAY=:0 gedit' | at now + 1 min

또는 더 일반적으로:

$ echo 'DISPLAY="$DISPLAY" gedit' | at now + 1 min

Wayland는 WAYLAND_DISPLAY일반적으로 wayland-0. 명령은 이 변수를 유지하므로 at작업이 실행될 때 GUI 응용 프로그램이 시작됩니다.at

관련 정보