web-dev-qa-db-ja.com

ExecStartコマンドラインでパラメーターを使用する方法

Debian(およびLinuxMintやUbuntu&Co.などの派生ディストリビューション)で使用されるSysVintitスクリプトを、FedoraまたはArchLinux(およびBridgeやManjaroなどの派生ディストリビューション)で使用されるsystemdサービスに変換しようとしていますが、systemd起動システムは以前よりも高性能で汎用性があり、ExecStart =やExecRestart =などのコマンドラインで「オプション」引数を使用するなど、単純なものを作成する方法がわかりません。

SysVinitを使用して以下を実行します。

#!/bin/sh
### BEGIN INIT INFO
# Provides:          myprog
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: myprog init script
# Descripton:        this script manages myprog
### END INIT INFO
# exit if myprog isn't installed
[ -x "/opt/mystuff/myrpog" ] || exit 0
case "$1" in
  start)
    cd /opt/mystuff
    ./myprog -r
    echo
    ;;
  stop)
    cd /opt/mystuff
    ./myprog -x
    ;;
  restart)
    cd /opt/mystuff
    ./myprog -x && ./myprog -r
    ;;
  version)
    cd /opt/mystuff
    ./myprog -v
    ;;
  try)
    cd /opt/mystuff
    ./myprog
    ;;
  *)
    echo "Usage: Sudo service myprog {start|stop|version|try}" >&2
    exit 3
    ;;
esac
:

そのため、上記のスクリプトでは、次のコマンドラインを使用するときに、「Usage:...」というメッセージを表示する空の引数など、さまざまな引数を使用できます。

Sudo service myprog start   => start myprog with the -r argument

Sudo service myprog stop    => stop myprog with the -x argument

Sudo service myprog version => display the release of myprog in the console

Sudo service myprog try     => start myprog without any argument

Sudo service myprog restart => stop then start myprog with the -r argument

suso service myprog         => display the "Usage:..." message in the console

Systemdを使用すると、スクリプトは次のようになります。

[Unit]
Description=This script manages myprog
ConditionFileExecutable=/opt/mystuff/myprog

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/opt/mystuf/myprog -r
ExecStop=/opt/mystuff/myprog -x
ExecRestart=/opt/mystuff/myprog -x : /opt/mystuff/myprog -r

[Install]
After=NetworkManager.service

ここから私の問題(およびシステム化された知識の欠如)が始まります:

明らかに、systemdは、ExecCustom01 =、ExecCustom02など、「バージョン」と「トライ」(および必要に応じて他のコマンド)を作成できるコマンドを提供していません。

そのため、引数を使用して「バージョン」または「試行」コマンドの両方を開始できる場合は、別の方法でExecRestartを使用できます(「実際の」再起動は、停止コマンドと開始コマンドを連続して開始することで行われます) )。

これらの「カスタマイズされた」ExecRestart =コマンドは、次のようになります。

Sudo systemctl restart myprog  => without argument for the "try" command

そして

Sudo systemctl restart myprog -v => for the "version" command

Systemdスクリプトは次のようになります。

[Unit]
Description=This script manages myprog
ConditionFileExecutable=/opt/mystuff/myprog

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/opt/mystuf/myprog -r
ExecStop=/opt/mystuff/myprog -x
ExecRestart=/opt/mystuff/myprog ????? // this is where I need to use an argument

[Install]
After=NetworkManager.service

しかし、それが可能かどうかはわかりませんが、可能であれば、使用する構文は何ですか?

Systemdの複数のmanページで何時間も費やした後でも、その方法に関する明確なサンプルが見つからなかったため、どんな助けも大歓迎です。

あなたの時間とアドバイスのためのTIA。

15
Fnux

Systemdはユニットファイルにコマンドライン引数を渡す方法を実際に提供していませんが、インスタンスを書く可能性があります: http://0pointer.de/blog/projects/instances.html

例えば: /lib/systemd/system/[email protected]は次のようになります。

[Unit]
Description=Serial Getty on %I
BindTo=dev-%i.device
After=dev-%i.device systemd-user-sessions.service

[Service]
ExecStart=-/sbin/agetty -s %I 115200,38400,9600
Restart=always
RestartSec=0

したがって、次のように開始できます。

$ systemctl start [email protected]
$ systemctl start [email protected]

Systemdの場合、異なるインスタンス

$ systemctl status [email protected]
[email protected] - Getty on ttyUSB0
      Loaded: loaded (/lib/systemd/system/[email protected]; static)
      Active: active (running) since Mon, 26 Sep 2011 04:20:44 +0200; 2s ago
    Main PID: 5443 (agetty)
      CGroup: name=systemd:/system/[email protected]/ttyUSB0
          └ 5443 /sbin/agetty -s ttyUSB0 115200,38400,9600

また、個別に有効化および無効化できる可能性が高いことも意味します。

もちろん、コマンドライン解析の力はあまりありませんが、一般的な方法では、何らかの構成ファイル選択として使用されます。たとえば、Fedora openvpn @ .serviceをご覧ください。 http://pkgs.fedoraproject.org/cgit/openvpn.git/tree/[email protected]

22
Hubbitus

コマンドライン引数を直接試みることはできません。

1つの代替手段は環境変数です( https://superuser.com/questions/728951/systemd-giving-my-service-multiple-arguments )。

これは私が答えを見つけた場所です: http://www.freedesktop.org/software/systemd/man/systemctl.html

そう Sudo systemctl restart myprog -v-systemctlは、myprogのフラグではなく、フラグの1つを設定しようとしているとみなします。

Sudo systemctl restart myprog someotheroption-systemctlは、myprogおよびsomeotheroptionサービス(存在する場合)を再起動します。

2
Juan