外部ファイルで定義されたユーザーとしてコマンドを実行できる一般的なシステムサービスファイルを持つ方法を探しています。これにより、異なるユーザーとして異なるサーバーインスタンスを起動できますが、同じバージョンが複数あることはできません。
頑張った
[Service]
Type=forking
# Specify the level of the myserver instances on this host.
EnvironmentFile=/data/myserver/instances/LEVEL
EnvironmentFile=/data/myserver/instances/%i/USER
ExecStart=/sbin/daemonize /data/myserver/bin/start.sh %i ${LEVEL}
ExecStop=/data/myserver/bin/stop.sh %i
User=$USER
環境ファイルにこれを持っています
USER=user1
環境ファイルを読む前に$ USERが評価されているようです。次のようなことは許可されますか?
[Service]
Type=forking
# Specify the level of the myserver instances on this host.
EnvironmentFile=/data/myserver/instances/LEVEL
EnvironmentFile=/data/myserver/instances/%i/USER
ExecStart=/sbin/daemonize /bin/sudo -u $USER /data/myserver/bin/start.sh %i ${LEVEL}
ExecStop=/data/myserver/bin/stop.sh %i
User=root
答え1
Systemdは、テンプレート化されたサービス単位ファイルを使用してインスタンス化されたサービスをサポートします。 「サービステンプレート」を参照してください。https://www.man7.org/linux/man-pages/man5/systemd.service.5.html。
一般的な例は、VNCサービステンプレート単位ファイル(TigerVNCサーバーによってインストールされます)です。以下はOpenVPNの例です。https://fedoramagazine.org/systemd-template-unit-files/
答え2
私が結局やったことは
[Service]
Type=forking
# Run as user1 by default
Environment='USER=user1'
# Specify the level of the myserver instances on this host.
EnvironmentFile=/data/myserver/instances/LEVEL
# Allow the specific instance to override the level
EnvironmentFile=-/data/myserver/instances/%i/LEVEL
# Possibly override who this runs as
EnvironmentFile=-/data/myserver/instances/%i/USER
ExecStart=/sbin/daemonize -u $USER /data/myserver/bin/start.sh %i ${LEVEL}
ExecStop=/bin/su - $USER -c '/data/myserver/bin/stop.sh %i'
User=root