我尝试使用脚本
#!/bin/sh
### BEGIN INIT INFO
# Provides: my Desktop setting
# Default-Start: 1 2 3 5 6
# Default-Stop:
# Description: Desktop setting
### END INIT INFO
mkdir /media/500g
mount /dev/sda1 /media/500g
d=0
checkdisplay()
{
if [ -z "$DISPLAY" ]; then
echo Display not set
else
d=111
fi
return $d
}
while [ $d != 111 ]
do
checkdisplay
done
pcmanfm --desktop
echo "pcmanfm desktop should run"
但系统日志显示:
my_basic.service:失败,结果为“超时”。
当我从终端测试它时,代码有效。
答案1
在启动时执行的启动脚本中,DISPLAY
永远不会设置该变量。通常,X 显示管理器(gdm
、sddm
或xdm
其他*dm
)或startx
命令将启动 X 服务器并设置 GUI 会话,并且只有这些进程及其子进程才会DISPLAY
设置该变量。
当启动一个新进程时,其父进程将为其提供一组环境变量(如DISPLAY
)。通常它只是祖父进程提供给父进程的一组环境变量的副本,但如果有必要,父进程可以在传递变量之前对其进行修改。进程启动后,父进程将无法再以任何方式更改子进程的环境变量:子进程和父进程都将拥有自己的一组完全相互独立的环境变量。
因此你的checkdisplay()
测试没有意义:如果DISPLAY
在启动脚本时没有设置变量,那么在脚本运行时它将不会被设置,除非你的脚本故意改变它。
在我看来,您的脚本不应作为系统启动脚本放置,而应作为 X11 会话启动脚本放置。如果您使用的是 Ubuntu/Debian,如果您希望此脚本为所有用户运行,那么这里可能是正确的地方;如果您希望它仅为某个特定用户运行,那么这将取决于您使用的桌面环境或窗口管理器:如果您的桌面符合相对较新的 Freedesktop.org 标准,那么/etc/X11/Xsession.d
将脚本放入其中可能是解决方案。~/.config/autostart-scripts
答案2
经过几天的搜索和测试,我找到了最有效的解决方案。问题是启动完成后必须安排桌面 - 在我的情况下是 之后xorg.service
。
步骤如下:
- 我创建了两个文件“my_desktop.service”和“my_desktop”
文件“my_desktop.service”位于/etc/systemd/system
并包含代码:
[Unit]
Description=My Desktop
After=xorg.service
[Service]
Type=idle
Restart=on-failure
ExecStart=/usr/local/bin/my_desktop
[Install]
WantedBy=multi-user.target
文件“my_desktop”位于/usr/local/bin/
并包含代码:
#!/bin/sh
# Description: Desktop setting
export DISPLAY=:0.0
pcmanfm --desktop
- 我按以下顺序通过终端(逐个)激活了上述服务:
systemctl daemon-reload
systemctl enable my_desktop.service
systemctl start my_desktop.service
...现在我的桌面运行顺畅
所以我的脚本必须用作启动后服务。