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
Redshift 与X 服务器绑定。虽然您可以将其作为系统启动的一部分来启动,但这很脆弱;启动它的可靠方法是在 X 服务器会话的上下文中(比 X 登录会话更广泛)。
\n\n在给定时间,同一台机器上可以运行多个 X 服务器。它们按照先到先得的原则分配显示号码。显示编号是程序如何知道要联系哪个服务器以及程序在DISPLAY
环境变量中查找它的方式。启动 GUI 程序的自然方法是在DISPLAY
将环境变量设置为所需值的上下文中。
您可以假设 lightdm 是启动 X 服务器的第一个实体,因此它是 display :0
,并在您的 upstart 作业中硬编码环境变量DISPLAY=:0
。您还需要设置该XAUTHORITY
变量(请参阅在远程 X 显示器上打开窗口(为什么“无法打开显示器”)?)。我认为 Ubuntu 上的 lightdm 将 cookie 存储在/var/lib/lightdm/.Xauthority
.
env DISPLAY=":0"\nenv XAUTHORITY="/var/lib/lightdm/.Xauthority"\n
Run Code Online (Sandbox Code Playgroud)\n\n但这很脆弱:它假设显示 lightdm 最终位于 is :0
。我认为由于竞争条件,它不会以当前的形式工作:该lightdm
作业可能会被认为是在 X 服务器启动并运行之前开始的(不过我对此不确定,我不知道在作业在什么点算开始)。
干净的方法是让 lightdm 启动 Redshift。这样它就可以在正确的时间、正确的背景下开始。编辑/etc/lightdm/lightdm.conf
并添加redshift -c /etc/redshift.conf
到display-setup-script
该部分中的行SeatDefaults
:
[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 应用程序通常在显示消失时退出,因此无需跟踪进程并显式终止它。