systemd サービスを使用してログインする前に、統合リモートサーバーを起動します。

systemd サービスを使用してログインする前に、統合リモートサーバーを起動します。

今走ろうとしています。統合リモートサーバーログインする前に。 (ログインが必要です)

ログイン後に正常に実行して正常に動作します。

これは私の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.

2つのエラーがあるようです。

  1. 文字通り、環境変数が正しく解析されていないcat: /.urserver/urserver.pid: No such file or directoryようです。$HOME
  2. 一部の依存関係がまだロードされていないようです。ロードされたことをどのように確認できますか?

答え1

Busterを含むRaspberry Pi 4Bでサービスurserverとしてsystemd起動しようとすると、他のエラーが発生します。あなたの問題と全く関係がないかもしれません。

これは私にとって効果的でした。重要なのは、systemdがそれを無視するように終了0で起動スクリプトを終了することです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

サーバーの起動:

#!/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~shsystemdshsh&&|ExecStart=

このEnvironment=行を削除すると、すべての問題が解決される可能性があります。ただし、そうでない場合は、次のようないくつかの注意事項があります。


User=root
Group=sudo

これは少し変です。 User=rootシステムバス上で実行されている場合はすでに暗黙的であるため、重複しています。グループが所有する新しいファイルを作成できるというGroup=sudo点でのみ役に立つと思います。ただし、これは実際にはグループのメンバーであり、デフォルトでグループから読み書き可能な新しいファイルを作成するsudo場合にのみ可能です。おそらく大きな影響はありませんが、それを取り除くことができると思います。rootsudoumask


お客様のサービスですので、Type=forking以下を追加してみてください。

PIDFile=/root/.urserver/urserver.pid

これは、システムがサービスの主要なプロセスを確実に識別するのに役立ちます。


これらのDSO_loadエラーは、アプリケーションがモジュールを動的にロードできないことを示します。メッセージは切り捨てられたように見えますが、関連していますssl

を見ると、変数は設定ファイルを含むディレクトリではなく設定ファイルを指す必要があることman opensslがわかりました。OPENSSL_CONFこの行を削除するか、次のようなものを試してください。

Environment=OPENSSL_CONF=/etc/ssl/openssl.cnf

これがデフォルトの場所である可能性があるため、この変数を設定する必要はないかもしれません。

関連情報