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