web-dev-qa-db-ja.com

システムスリープスクリプトが実行されていません

単純なスクリプト/lib/systemd/system-sleep/start_my_lockがあり、システムがサスペンドされたときに実行されません。i3lockをデフォルトのロックにしようとしています。

#!/bin/bash
case $1 in
  pre)
    scrot /home/jappatel/tmp/screen.png
    convert /home/jappatel/tmp/screen.png -scale 10% -scale 1000% /home/jappatel/tmp/screen.png
    convert /home/jappatel/tmp/screen.png /home/jappatel/Pictures/Icons/lock.png -gravity center -composite -Matte /home/jappatel/tmp/screen.png
    i3lock -i /home/jappatel/tmp/screen.png
    rm /home/jappatel/tmp/screen.png
    ;;
esac
4
Jay Patel

解決策 rootではなくローカルユーザーでスクリプトを実行する必要がありました

su jappatel -c <command>

また、実行して、表示も指定します

DISPLAY=:0

私の最終的なスクリプト

#!/bin/bash
case $1 in
  pre)
    su jappatel -c "
    DISPLAY=:0 scrot /home/jappatel/tmp/screen.png;
    convert /home/jappatel/tmp/screen.png -scale 10% -scale 1000% /home/jappatel/tmp/screen.png;
    convert /home/jappatel/tmp/screen.png /home/jappatel/Pictures/Icons/lock.png -gravity center -composite -Matte /home/jappatel/tmp/screen.png;
    DISPLAY=:0 i3lock -i /home/jappatel/tmp/screen.png;
    rm /home/jappatel/tmp/screen.png"
    ;;
esac
2
Jay Patel

ディスプレイサーバーまたはscroti3lockなどのユーザーセッションに依存するツールは、ディスプレイサーバーやユーザーセッションを見つけることができないため、バックグラウンドシステムスクリプトでは機能しません。

解決

これらのツールを次のいずれかで呼び出す前に、DISPLAY環境変数を設定する必要があります

export DISPLAY=:0

または

DISPLAY=:0 <COMMAND>

何らかの理由でDISPLAYに異なる値が必要な場合は、適切に調整してください。 echo "$DISPLAY"を使用すると、グラフィカルセッション内からcurrent値を確認できます。

非常によく似た問題の詳細については、 cronからGUIアプリケーションを起動する方法? を参照してください。

テスト中

呼び出しに接頭辞env -iを付けると、セッション関連の環境変数なしで実行するスクリプトをテストできます。 g。

env -i /lib/systemd/system-sleep/start_my_lock

環境変数リストを空にします。

1
David Foerster