我在 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
命令非常重要,因为cron
PATH 知识有限,可能找不到诸如/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
cron 作业,它根据我所在城市的互联网每日日出和日落时间来设置亮度。 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
然后,您可以将其与当前环境进行比较,看看可能缺少哪些环境变量(对于某个命令)。