您可以使用启动应用程序

您可以使用启动应用程序

我在 Ubuntu 18.04 64 位上,我试图保存我的两个屏幕的分辨率,所以我试图放置一个使用 xrandr 来设置它的脚本(如果我从终端执行脚本,它就会起作用),所以我把它放在 crontab 中(通过使用这个语法:sudo crontab - e并在最后一行添加此代码:)@reboot /avvio/; ./screen.sh但它什么也不做,脚本有效,我确定它会被执行,因为我尝试在脚本中添加其他内容并且它们有效,如果我从终端启动它,它也会设置分辨率,但它不会在启动时设置它。screen.sh 的代码是

#!/bin/bash
xrandr --newmode "1680x1050_60.00"  146.25  1680 1784 1960 2240  1050 1053 1059 1089 -hsync +vsync
xrandr --addmode VGA-1 "1680x1050_60.00"
xrandr --output VGA-1 --mode 1680x1050_60.00 --pos 1920x0 --output HDMI-1 --primary --pos 0x0

答案1

您可以使用启动应用程序

xrandr不需要sudo权限,因此您可以将脚本放在启动应用程序. 一般只cron对需要权限的工作使用启动脚本sudo


新脚本

最初的答案是参考。这个新答案使用了参考文献并删除了不必要的代码。然后将 OP 代码添加到新答案的底部。

使用sudo -H gedit /etc/cron.d/start_screen并插入以下行:

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
@reboot   root    /usr/local/bin/screen.sh

保存文件。无需将其标记为可执行文件。

笔记:PATH命令非常重要,因为cronPATH 知识有限,可能找不到诸如/usr/bin/who或 之类的命令/usr/bin/awk

内容/usr/local/bin/screen.sh

#! /bin/bash

# NAME: screen.sh
# PATH: /usr/local/bin
# DESC: Set screen to brightness .5 to confirm it can be done.
#       Ask Ubuntu question: https://askubuntu.com/questions/1102389/xrandr-not-working-on-crontab/1102436?noredirect=1#comment1817209_1102436
# CALL: called from `/etc/cron.d/start-screen`
# DATE: Created December 17, 2018.

#!/bin/bash

export DISPLAY=:0       # For xrandr commands to work.

# wait until user signs on to get .Xauthority file settings.
UserName=""
while [[ $UserName == "" ]]; do
    sleep 2
    logger "screen.sh slept 2 seconds waiting for login"
    UserName="$(who -u | grep -F '(:0)' | head -n 1 | awk '{print $1}')"
done

sleep 30
logger "screen.sh slept 30 seconds waiting for other xrandr tasks to finish"

xhost local:root
export XAUTHORITY="/home/$UserName/.Xauthority"

xrandr --output eDP-1-1 --brightness .5

我已经在我的机器上测试过了,运行完美。您需要进行以下更改:

  • 改成/usr/local/bin//avvio/
  • 删除或减少sleep 30。我需要它,因为我有一个现有的eyesome.shcron 作业,它根据我所在城市的互联网每日日出和日落时间来设置亮度。
  • xrandr用你的三行xrandr代码替换最后一行

验证结果

logger脚本中有命令。您可以使用以下命令查看它是否正常工作:

$ journalctl -b -xe | grep screen.sh
Dec 17 14:25:56 alien CRON[1170]: (root) CMD (   /usr/local/bin/screen.sh)
Dec 17 14:25:58 alien root[1728]: screen.sh slept 2 seconds waiting for login
Dec 17 14:26:00 alien root[1790]: screen.sh slept 2 seconds waiting for login
Dec 17 14:26:02 alien root[1973]: screen.sh slept 2 seconds waiting for login
Dec 17 14:26:04 alien root[2070]: screen.sh slept 2 seconds waiting for login
Dec 17 14:26:06 alien root[2300]: screen.sh slept 2 seconds waiting for login
Dec 17 14:26:36 alien root[5355]: screen.sh slept 30 seconds waiting for other xrandr tasks to finish

原始答案

Cron 的@reboot选项在机器启动后不久、用户登录前运行。xrandr命令在用户登录前不起作用。您可以使用以下代码令人赏心悦目并适应您的目的:

export DISPLAY=:0       # For xrandr commands to work.
SpamOn=0                # > 0 = number of times to spam in loop.
SpamCount=5             # How many times we will spam (perform short sleep)
SpamLength=2            # How long spam lasts (how many seconds to sleep)
SpamContext=""          # Why are we spamming? (Login, Suspend or Lid Event)
                        # Future use: "DPMS Change" ie Monitor on or off.
WaitForSignOn () {

    # eyesome daemon is loaded during boot. The user name is required
    # for xrandr external monitor brightness and gamma control. We must
    # wait until user signs on to get .Xauthority file settings.

    SpamOn=10       # Causes 10 iterations of 2 second sleep
    SpamContext="Login"
    TotalWait=0
    [[ ! -f "$CurrentBrightnessFilename" ]] && rm -f \
            "$CurrentBrightnessFilename"

    # Wait for user to sign on then get Xserver access for xrandr calls
    UserName=""
    while [[ $UserName == "" ]]; do

        sleep "$SpamLength"
        TotalWait=$(( TotalWait + SpamLength ))

        # Find UserName currently logged in.
        UserName="$(who -u | grep -F '(:0)' | head -n 1 | awk '{print $1}')"
    done

    log "Waited $TotalWait seconds for $UserName to login."

    xhost local:root
    export XAUTHORITY="/home/$UserName/.Xauthority"

    if [[ "$fUseDbusMonitor" == true ]] ; then
        echo "$UserName" > "$EyesomeUser"
        sync -d "$EyesomeUser"      # Flush buffer immediately
    fi

} # WaitForSignOn

答案2

对我来说,我正在尝试使用使用 randr 的 redshift,所以我认为这可能会有效:

您的 crontab 脚本缺少环境变量DISPLAY=:0

所以只需将其放在 crontab 文件的顶部。

还有未来的调试技术:

使用以下方法将 crontab 环境记录到特定文件:

* * * * * env > your_log_file.log

然后,您可以将其与当前环境进行比较,看看可能缺少哪些环境变量(对于某个命令)。

相关内容