使用 Linux 也要爱护眼睛【Linux 下的夜间模式】

前言

从比较久以前开始,“夜间模式”就成了国内手机的标配功能之一。当时我还是不屑的,咋一看不就是把屏幕变成了黄色么。直到 Android 7.0 官方支持了夜间模式,我亲自用上了才发现它的好。

确实,对于手机而言这是个硬需求,因为大晚上还在用手机太常见了。而手机靠近眼睛很近,并且通常手机屏幕的亮度无法调到很低,导致晚上真的很刺眼。

(所以我的手机必开夜间模式)

当然,PC 操作系统厂商们也不能忽略电脑用户的这个需求,就像标题图片上的截图那样,Windows10 不知道从什么时候起也支持这个功能了。

并且效果体验非常好,系统原生支持定时开关任务。

那么,我们 Linux 用户不能享受这个功能么?至于现在的桌面环境好像没听说那个支持的。那我这种经常晚上仍然在使用 Linux 的人,眼睛岂不是要瞎掉啊!

(当然,我不会那么蠢,我会将显示器亮度调到很低)

注意:经提醒和确认,Gnome3 已经有了夜间模式,所以Gnome3 用户不需要本文的方案~

解决方案

这里我们要使用一款叫 Redshift 的软件 + 通常发行版都自带的 Cron 实现相同的功能。

  • Redshift 是一个能智能调节显示器色温的开源软件,仓库地址:jonls/redshift
  • Cron 是 *nix 上常见的周期性执行任务的一个组件(虽然它的地位正严重受到 Systemd/Timers 的威胁)

首先我们安装 redshift,使用包含最新版本的 PPA(添加完别忘记 update):

sudo add-apt-repository ppa:dobey/redshift-daily

其它发行版通常默认源已经存在:

sudo apt install redshift

然后去查看你所在的位置的纬度和经度,当做参数(LAT:LON)启动 redshift:

redshift -l 31:121

纬度:31 和经度:121 的地理位置是上海,你自己的位置自己去获取一下:)

此时屏幕色温会逐渐的调节,从感官上感觉效果跟 Windows10 上的基本一样

最后就是用 cron 实现定时开启和关闭 redshift 的“夜间模式”了(添加两个任务):

DISPLAY=:0.0

# 开启 redshift
30 22 * * * redshift -l 31:121
# 关闭 redshift
30 06 * * * killall redshift

上面的时间是 22:30 开启,6:30 关闭,有需要的自行调整。注意:DISPLAY 变量必须要有:)

Redshift 在收到 Kill 信号以后,会将色温“渐变”回去然后关闭。

看起来不会很突兀好像一下子就变过来了,毕竟你的眼睛可能经受不了这么突然的变化 😂😂😂

附加

有人评论说 Redshift 本身就可以设置白天和晚上的亮度(应该说色温),不需要 Cron

这个确实是的,如果你写一份配置文件,设置好指定调节策略(太阳高度或时间)和温度值就行。但是我并不想让 Redshift 随着系统启动常驻(因为我只有在晚上使用它),所以我直接在白天的时候关掉,晚上再开启。

当然你也可以完全按照它的方式运行它,只不过你得细心配置几个地方,否则你将永远看不到显示器正常的显示效果

—— 再次更新:

思来想去我还是把 Redshift 在系统启动后全程接管色温等参数的控制方案写出来的,这也是 redshift 本身的运作方式(虽然我一直是以 corntab 任务作为开关使用过来的)。

Redshift 在这里将作为一个常驻的守护进程,无论是白天还是晚上都根据配置进行调节。

注意:如果你不想在白天的时候让 Redshift 调整你显示器的任何参数的话,那你就得搞清楚你显示器的默认色温。

首先创建配置文件 redshift.conf(存放位置看你个人喜好):

[redshift]
# 白天色温
temp-day=6500
# 夜晚色温
temp-night=3500
# 平滑过渡
fade=1
# 夜晚 gamma 值
gamma-night=0.8
# 手动设置位置
location-provider=manual
# 新校准方法 API
adjustment-method=randr

[manual]
# 纬度
lat=31
# 经度
lon=121

[randr]
screen=0

需要注意的是上面两个地方:

  • temp-day: 这个值需要用你显示器的默认色温,例如上面配置的是我的显示器 6500K 的色温。如果你不设置成显示器该有的色温的话,你将永远看不到显示器原本的效果。我认为这是有大问题的,至少在某些场景对颜色的要求很苛刻(例如设计师的专业显示器),而白天一般又不需要所谓的“护眼模式”
  • gamma: 在上面的配置中没有 gamma 这个配置项,因为被我删掉了(Sample 配置是有的)。我使用了 gamma- night 这个仅配置夜晚 gamma 值的配置项。原因跟上面相同,如果你不指定为夜晚的话,全时间段都调整 gamma 会造成显示器无法显示原本的效果。

另外还有其它配置项和注释请参考 Sample 配置文件,但是同样的如果你不想在白天应用任何显示器调整的话配置就要细心点。

接着编辑 Systemd 脚本:

sudo vi /usr/lib/systemd/user/redshift.service

主要是添加一个 DISPLAY 的环境变量和添加一个执行文件的参数,完整内容为:

[Unit]
Description=Redshift display colour temperature adjustment
Documentation=http://jonls.dk/redshift/
After=display-manager.service

[Service]
# 新增的环境变量
Environment=DISPLAY=:0
# 在这里添加了一个 -c 参数
ExecStart=/usr/bin/redshift -c /etc/redshift.conf
Restart=always

[Install]
WantedBy=default.target

注意:上面的 -c 参数后面的路径就是上面的配置文件,这个路径要改成你存放的位置。

重载配置:

systemctl --user daemon-reload

最后让服务开机启动:

systemctl --user enable redshift

PS:如果决定用这种方式请删掉 crontab 的相关任务。

效果就是 Redshift 守护进程会无时无刻的运行,在白天的时候不做显示器的任何调整,晚上根据配置进行变化。

其实这样做更好一些,但是我当初觉得既然我不想在白天使用,那么我直接白天 Kill 掉进程,晚上再启动不就行了,所以我一直用的是 Cron 定时跑任务作为开关。

结束语

总算不用老是调显示器亮度了。 Over~