S3スリープ(一時停止)またはS4スリープ(休止)から目覚めた後にXプログラムを自動的に実行するには?

S3スリープ(一時停止)またはS4スリープ(休止)から目覚めた後にXプログラムを自動的に実行するには?

既存の問題systemdが起動した後にユーザースクリプトを実行する方法は?睡眠から目覚めた後にスクリプトを実行できる答えはすでにあります。ただし、この問題に対して提供されるソリューションには、ユーザーのためのハードコーディングが必要です。

現在記録されているすべてのグラフィックデスクトップセッションで自動的に実行されるスクリプトを生成するにはどうすればよいですか?(つまり、高速ユーザー切り替え/「アカウント切り替え」を使用して複数の仮想端末で複数のデスクトップを並列に実行するときは、正しい環境変数値を使用して各ユーザーに対してスクリプトを実行する必要がありますDISPLAYXAUTHORITY

私は個人的にこれを使用してlightdm新しいセッションを作成するか、既存のセッションに再度ログインしますが、ディスプレイマネージャ独立ソリューションを好む。

答え1

回復時にログインしたX.orgユーザーを列挙し、必要なものをすべて実行できます。現在ログインしているユーザーのリストを取得する方法には多くのソリューションがありますが、ほとんどは古く、最新のLinuxディストリビューションでは機能しない可能性があります。wたとえばwholast私のFedora 36システムでは何も返しませんw。最後の項目を表示:wholastreboot

last | head -1
reboot   system boot  5.19.4-az2       Sun Sep  4 01:56   still running

それがあなたに役立つなら、あなたはそれを使うことができます。

以下は、2022年9月から適用されるべき現代的なアプローチです(Linuxへのタイムスタンプの答えは常に良い考えです)。

$ loginctl --no-legend list-sessions # or run it without any parameters
SESSION  UID USER   SEAT  TTY 
      2 1000 birdie seat0 tty7

またはgdbusプログラミングに情熱がある場合:

$ gdbus call --system --dest org.freedesktop.login1 --object-path /org/freedesktop/login1 --method org.freedesktop.login1.Manager.ListSessions
([('2', uint32 1000, 'birdie', 'seat0', objectpath '/org/freedesktop/login1/session/_32')],)

続けて一緒にしましょうloginctl。 Xorgがユーザーに表示する内容を理解したい場合があります。方法は次のとおりです。

#! /bin/bash

for session in `loginctl --no-legend list-sessions | awk '{print $1}'`; do
    echo -e "ID\tName\tDisplay"
    eval `loginctl show-session $session | egrep '^Display|^User|^Name'`
    echo -e "$User\t$Name\t$Display"
done

# output
ID  Name    Display
1000    birdie  :0

echoステートメントの代わりに必要なものを実行できます。

    export XAUTHORITY="`getent passwd $Name | cut -f6 -d:`/.Xauthority"
    export DISPLAY=$Display
    command

関連情報