`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コメントに示されているとおりに試しましたが、1gedit分後でもまだ実行されません。

答え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 Frameworkatに保存します/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

関連情報