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