在登录屏幕之前执行脚本

在登录屏幕之前执行脚本

我正在尝试在 中的登录屏幕之前运行脚本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的解决方案。我已经创建了 Monitor-check.service/etc/systemd/system并尝试执行它/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'.

我尝试通过将:添加 Environment=XAUTHORITY=/run/user/1000/gdm/Xauthority到该Service部分来将环境变量添加到 Xauthority,但没有帮助。

我也尝试过 Praveen 提出的解决方案,但它也不起作用。事实上,我已将脚本添加到/etc/profile.d目录中,但它没有执行该脚本,因此我的分辨率仍然是旧的。

总之,唯一有效的两个解决方案是将脚本添加到~/.profile启动应用程序或将其手动添加到启动应用程序,但这两种解决方案都会更改分辨率并在登录系统后关闭内部笔记本电脑显示屏。

答案1

Ubuntu 19.04 使用systemd此类脚本的首选方式是使用 sysd-service。

为此,您将需要两个文件: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

Description并且ExecStart应该是不言自明的,Type=Simple意味着脚本仅运行一次(而不是每 X 秒左右),并WantedBy=multi-user.target在“正常”启动(不是关机,不是救援模式,图形可选)时运行它。当然,您可以使脚本可执行而不添加到 -line/bin/bashExecStart

该脚本的/etc/systemd/system名称为 例如monitor-check.service,请注意.service- 后缀是强制性的!将所有权root和权限设置为644

您可以通过以下方式测试该服务

systemctl start monitor-check

或者

service monitor-check start

并通过在上述命令中替换start为来检查状态。status

要启用作为引导服务,请使用:

systemctl enable monitor-check.service

如果您现在查看service monitor-check status,您应该阅读enabled-Loaded:行。

644当然,出于安全原因,脚本本身应该由 root 拥有并具有- 权限。最好的方法是将其保存在新目录中,例如/etc/my_scripts/etc/systemd/my_scripts

重新启动后,您可以使用服务的状态来检查其退出代码。

答案2

Kindly add the script in /etc/profile.d

如果您希望它是特定于用户的,请添加到以下位置,以便在用户登录时执行

/home/username/.profile

相关内容