xrandr, не работающий над crontab

Я нахожусь на Ubuntu 18.04 64bit, я пытаюсь сохранить разрешение своих 2 экранов, таким образом, я пытаюсь поместить сценарий, кто использует 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
2
задан 16 December 2018 в 21:57

1 ответ

Можно использовать Приложения Запуска

xrandr не требует sudo полномочия, таким образом, можно поместить сценарий в Приложения Запуска. Обычно только используйте cron сценарии начальной загрузки для требования заданий sudo полномочия.


Новый сценарий

Исходный ответ был ссылкой. Этот новый ответ использует ссылку и вынимает ненужный код. Затем Код операции добавляется к нижней части нового ответа.

Использовать 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 команда очень важна как cron ограничил знание ПУТИ и может не найти команды таким как /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.sh задание крона, которое устанавливает яркость на основе Интернета ежедневный восход солнца и времена заката для моего города.
  • Замените последнее 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

Исходный ответ

Крон @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
1
ответ дан 2 December 2019 в 04:39

Другие вопросы по тегам:

Похожие вопросы: