何时是使用 upstart 启动 Redshift 的合适时间?

Rap*_*ael 6 startup x11 upstart services lightdm

我一直在尝试让Redshift登录启动以便明亮的欢迎屏幕不会让我蒙蔽,尤其是在切换用户时。

似乎没有完全支持将 Redshift 作为服务运行(参见例如这个 bug),但原则上似乎是可能的。

在尝试了在 AskUbuntu 上发现的一些东西但没有成功之后,我目前的尝试是建立自己的暴发户任务;这是我的/etc/init/redshift.conf

# Redshift

description "Redshift"
author      "dude@somewhere.com"

start on (started lightdm)

script
  exec redshift -c /etc/redshift.conf
end script

stop on runlevel [016]
Run Code Online (Sandbox Code Playgroud)

我认为在 LightDM 运行后开始应该会奏效,然后停止。

现在,这最终出现在我的日志文件中/var/log/upstart/redshift.log

`RANDR Query Version' returned error -1
Initialization of randr failed.
Run Code Online (Sandbox Code Playgroud)

谷歌搜索错误信息不是很丰富。我我还为时过早,一些服务或其他与显示魔法相关的服务尚未运行。

我的start on表情应该是什么?

Ubuntu 14.04 LTS;3.13.0-77-generic #121-Ubuntu SMP ... x86_64 GNU/Linux;
红移 1.8;RandR 服务器版本 1.4;新贵 1.12.1

Gil*_*il' 4

Redshift 与X 服务器绑定。虽然您可以将其作为系统启动的一部分来启动,但这很脆弱;启动它的可靠方法是在 X 服务器会话的上下文中(比 X 登录会话更广泛)。

\n\n

在给定时间,同一台机器上可以运行多个 X 服务器。它们按照先到先得的原则分配显示号码。显示编号是程序如何知道要联系哪个服务器以及程序在DISPLAY环境变量中查找它的方式。启动 GUI 程序的自然方法是在DISPLAY将环境变量设置为所需值的上下文中。

\n\n

您可以假设 lightdm 是启动 X 服务器的第一个实体,因此它是 display :0,并在您的 upstart 作业中硬编码环境变量DISPLAY=:0。您还需要设置该XAUTHORITY变量(请参阅在远程 X 显示器上打开窗口(为什么“无法打开显示器”)?)。我认为 Ubuntu 上的 lightdm 将 cookie 存储在/var/lib/lightdm/.Xauthority.

\n\n
env DISPLAY=":0"\nenv XAUTHORITY="/var/lib/lightdm/.Xauthority"\n
Run Code Online (Sandbox Code Playgroud)\n\n

但这很脆弱:它假设显示 lightdm 最终位于 is :0。我认为由于竞争条件,它不会以当前的形式工作:该lightdm作业可能会被认为是在 X 服务器启动并运行之前开始的(不过我对此不确定,我不知道在作业在什么点算开始)。

\n\n

干净的方法是让 lightdm 启动 Redshift。这样它就可以在正确的时间、正确的背景下开始。编辑/etc/lightdm/lightdm.conf并添加redshift -c /etc/redshift.confdisplay-setup-script该部分中的行SeatDefaults

\n\n
[SeatDefaults]\n\xe2\x80\xa6\ndisplay-setup-script=redshift -c /etc/redshift.conf &\n
Run Code Online (Sandbox Code Playgroud)\n\n

请注意在后台&启动redshift(否则 lightdm 将等待它完成)。我认为 Redshift 会在 X 服务器退出时退出(X 应用程序通常在显示消失时退出,因此无需跟踪进程并显式终止它。

\n