我目前正在尝试运行统一远程服务器登录前。 (需要使用它来登录)
我已经成功地在登录后运行它,所以它可以正常工作。
这是我的systemd
.service
文件
[Unit]
Description=Unified Remote Server
After=syslog.target network.target
[Service]
Type=forking
User=root
Group=sudo
Environment=HOME=~
Environment=OPENSSL_CONF=/etc/ssl/
ExecStart=/opt/urserver/urserver-start --no-manager --no-notify
ExecStop=/opt/urserver/urserver-stop
[Install]
WantedBy=default.target
错误输出
Loaded: loaded (/lib/systemd/system/urserver.service; enabled; vendor preset: enabled)
Active: failed (Result: exit-code) since Fri 2020-07-17 01:07:06 EDT; 1h 52min ago
urserver-start[8014]: 140156550736640:error:25070067:DSO support routines:DSO_load:could not load the shared library:dso_lib.c:244:
urserver-start[8014]: 140156550736640:error:0E07506E:configuration file routines:MODULE_LOAD_DSO:error loading dso:conf_mod.c:285:module=ssl_
urserver-start[8014]: 140156550736640:error:0E076071:configuration file routines:MODULE_RUN:unknown module name:conf_mod.c:222:module=ssl_con
urserver-start[8014]: skipping manager
urserver-stop[8032]: cat: /.urserver/urserver.pid: No such file or directory
urserver-stop[8032]: process not detected
urserver-stop[8032]: rm: cannot remove '/.urserver/urserver.pid': No such file or directory
systemd[1]: urserver.service: Control process exited, code=exited, status=1/FAILURE
systemd[1]: urserver.service: Failed with result 'exit-code'.
systemd[1]: Failed to start Unified Remote Server.
看来我有两个错误
- 从
cat: /.urserver/urserver.pid: No such file or directory
字面上看,我认为$HOME
环境变量没有正确解析。 - 似乎某些依赖项可能尚未加载,我如何确保它已加载?
答案1
在带有 Buster 的 Raspberry Pi 4B 上,我在尝试urserver
作为systemd
服务启动时遇到了不同的错误。可能与您的问题根本无关。
这对我有用:我认为关键是使用 exit 0 退出启动脚本,以使 systemd 忽略triggerhappy
.
urserver.service:
[Unit]
Description=Unified Remote Server
After=syslog.target network.target
[Service]
Type=forking
User=root
Group=root
ExecStart=/opt/urserver/urserver-start --no-notify
ExecStop=/opt/urserver/urserver-stop
SyslogIdentifier=urserver
[Install]
WantedBy=multi-user.target
urserver-启动:
#!/bin/sh
#
# Path to installation directory
#
EXEC_PATH="/opt/urserver/urserver"
PID_PATH="$HOME/.urserver/urserver.pid"
ICON_PATH="/usr/share/icons/hicolor/96x96/apps/urserver.png"
REMOTES_PATH="$HOME/.urserver/remotes"
BACKUP_PATH="$HOME/.urserver/backup"
#
# Check arguments
#
NO_COPY=false
NO_MANAGER=false
NO_NOTIFY=false
for var in "$@"
do
if [ "$var" = "--no-copy" ]; then
NO_COPY=true
elif [ "$var" = "--no-manager" ]; then
NO_MANAGER=true
elif [ "$var" = "--no-notify" ]; then
NO_NOTIFY=true
fi
done
#
# Copy user files
#
if ! "$NO_COPY" = true; then
echo "copying user files"
mkdir -p "$HOME/.config/autostart/"
cp -uf /opt/urserver/urserver-autostart.desktop $HOME/.config/autostart/urserver.desktop
echo "backup remotes"
mkdir -p $BACKUP_PATH/
cp -af $REMOTES_PATH/. $BACKUP_PATH/
echo "create custom folder"
mkdir -p $REMOTES_PATH/custom/
echo "copying remotes"
rm -rf $REMOTES_PATH/remotes/
rm -rf $REMOTES_PATH/bundled/
mkdir -p $REMOTES_PATH/bundled/
cp -af /opt/urserver/remotes/. $REMOTES_PATH/bundled/
else
echo "skipping copy"
fi
#
# Start the server
#
echo "starting server"
mkdir -p "$HOME/.urserver"
$EXEC_PATH --remotes=$REMOTES_PATH --daemon
#
# Open the web manager
#
if ! "$NO_MANAGER" = true; then
echo "opening manager"
sleep 1
xdg-open http://localhost:9510/web 2> /dev/null
else
echo "skipping manager"
fi
exit 0
答案2
我首先删除Environment=HOME=~
.
systemd
自动设置$HOME
,因此您永远不需要指定它,除非您希望它是非默认的。当用户是的时候root
,我想$HOME
大概会被设置为/root
。另外,~
它是sh
主目录的快捷方式,但在 shell 之外它没有任何意义。 systemd
不是sh
也不支持所有sh
语法。您还会注意到诸如&&
或 之类的东西|
在 中不起作用ExecStart=
。
删除这Environment=
条线可能会解决您的所有问题。但如果没有,这里还有一些其他需要注意的事情:
User=root
Group=sudo
这个有点奇怪。 User=root
当它在系统总线中运行时已经隐含了,因此它是多余的。我只能看到Group=sudo
它的有用之处在于,可以创建由该sudo
组拥有的新文件,尽管这可能只有在root
实际上是该组的成员sudo
并且默认umask
创建作为组可读/可写的新文件时才有意义。我认为你可以删除这些,尽管这可能不会产生很大的影响。
由于您的服务是Type=forking
,请考虑添加:
PIDFile=/root/.urserver/urserver.pid
这将有助于 systemd 可靠地识别服务的主要进程
这些DSO_load
错误表明您的应用程序无法动态加载模块。该消息看起来被截断,但与 相关ssl
。
当我查找时man openssl
,我发现该OPENSSL_CONF
变量应该指向配置文件,而不是包含配置文件的目录。尝试删除此行或使用类似以下内容:
Environment=OPENSSL_CONF=/etc/ssl/openssl.cnf
请注意,这可能是默认位置,因此可能不需要设置该变量。