web-dev-qa-db-ja.com

ログイン画面の前にスクリプトを実行する

Ubuntu 19.04のログイン画面の前にスクリプトを実行しようとしています。スクリプトは、ノートブックに接続されている外部モニターがあるかどうかを確認し、ある場合は、解像度を3440x1440 @ 44に変更して、内部のラップトップディスプレイをオフにします。これは私のスクリプトです:

#!/bin/bash

EXTERNAL_OUTPUT="HDMI-1-1"
INTERNAL_OUTPUT="eDP-1-1"

xrandr |grep $EXTERNAL_OUTPUT | grep " connected "
if [ $? -eq 0 ]; then
    xrandr --output $INTERNAL_OUTPUT --off
    xrandr --newmode "3440x1440_44.00"  299.75  3440 3664 4024 4608  1440 1443 1453 1479 -hsync +vsync
    xrandr --addmode HDMI-1-1 "3440x1440_44.00"
    xrandr --output HDMI-1-1 --mode "3440x1440_44.00"
else
    xrandr --output $INTERNAL_OUTPUT --auto --output $EXTERNAL_OUTPUT --off
fi

このスクリプトを~/.profileとスタートアップアプリケーションの両方に配置しようとしましたが、GDMログインはまだノートブック画面にのみ表示されます。その時間より前でもこのスクリプトを実行して、コンピューターの起動時に黒い画像が表示されないようにします。

[更新]:提案された両方のソリューションを試しましたが、どちらも機能しませんでした。最初に私はFiximanの解決策を試しました。 /etc/systemd/systemでmonitor-check.serviceを作成し、/bin/bash /home/user/monitor-check.serviceを実行しようとしましたが、ラップトップの解像度が3440x1440に正常に変更されました。次に、実行しようとしました:Sudo systemctl start monitor-check.shこれはステータスメッセージです:

monitor-check.service - Service to check for external monitors during boot.
   Loaded: loaded (/etc/systemd/system/monitor-check.service; enabled; vendor preset: enabled)
   Active: failed (Result: exit-code) since Tue 2019-07-09 19:27:17 CEST; 5s ago
  Process: 4177 ExecStart=/bin/bash /home/user/Documents/scripts/display_setup.sh (code=exited, status=1/FAILURE)
 Main PID: 4177 (code=exited, status=1/FAILURE)

Jul 09 19:27:17 Acer systemd[1]: Started Service to check for external monitors during boot..
Jul 09 19:27:17 Acer bash[4177]: Can't open display
Jul 09 19:27:17 Acer bash[4177]: Can't open display
Jul 09 19:27:17 Acer systemd[1]: monitor-check.service: Main process exited, code=exited, status=1/FAILURE
Jul 09 19:27:17 Acer systemd[1]: monitor-check.service: Failed with result 'exit-code'.

ServiceセクションにEnvironment=XAUTHORITY=/run/user/1000/gdm/Xauthorityを追加して、環境変数をXauthorityに追加しようとしましたが、役に立ちませんでした。

Praveenが提案した解決策も試しましたが、うまくいきませんでした。実際、スクリプトを/etc/profile.dディレクトリに追加しましたが、スクリプトが実行されなかったため、解像度はまだ古いものでした。

結論として、機能した2つの解決策は、スクリプトを~/.profileに追加するか、スタートアップアプリケーションに手動で追加することだけでしたが、どちらの解決策も解像度を変更し、システムにログオンした後にラップトップの内部ディスプレイをオフにします。

1

Ubuntu19.04はsystemdを使用するため、このようなスクリプトの推奨される方法はsysd-serviceを使用することです。

このためには、2つのファイルが必要になります。1)既に作成したscript.sh(テスト済みで機能していると思います)と2)systemdサービスを定義するユニットファイル。

後者の例は次のとおりです。

[Unit]
Description=Service to check for external monitors during boot.

[Service]
Type=Simple
ExecStart=/bin/bash /path/to/your/monitor/script.sh

[Install]
WantedBy=multi-user.target

DescriptionExecStartは自明である必要があり、Type=Simpleはスクリプトが1回だけ(X秒ごとではなく)実行されることを意味し、WantedBy=multi-user.targetはそれを実行します「通常の」起動が完了したら実行します(シャットダウンではなく、レスキューモードではなく、グラフィックはオプションです)。もちろん、スクリプトを実行可能にすることはできますが、ExecStart-行に/bin/bashを追加することはできません。

スクリプトは/etc/systemd/systemに移動します。例: monitor-check.serviceという名前で、.service-サフィックスは必須であることに注意してください。所有権をrootに設定し、権限を644に設定します。

あなたはによってサービスをテストすることができます

systemctl start monitor-check

または

service monitor-check start

上記のコマンドでstartstatusに置き換えて、ステータスを確認します。

有効にするには、ブートサービスを使用します。

systemctl enable monitor-check.service

ここでservice monitor-check statusを見る場合は、Loaded:行のenabledを読む必要があります。

もちろん、スクリプト自体はrootが所有し、安全上の理由から644-権限を持っている必要があります。最良の方法は、たとえば次のような新しいディレクトリに保存することです。 /etc/my_scriptsまたは/etc/systemd/my_scripts

再起動後、サービスのステータスを使用して終了コードを確認できます。

1
Fiximan
Kindly add the script in /etc/profile.d

ユーザー固有のものにしたい場合は、ユーザーがログインしたときに実行されるように、以下の場所に追加してください

/home/username/.profile
1