systemdで引用符とドル記号を使用する方法

systemdで引用符とドル記号を使用する方法

私はこれをサービス宣言に使用します。

ExecStartPre=/usr/bin/docker pull "$DOCKER_USERNAME/redis-replication:latest"

サービスを開始しようとすると、systemdログに次のものが表示されます。

Usage: docker pull [OPTIONS] NAME[:TAG]
Pull an image or a repository from the registry
-a, --all-tags=false    Download all tagged images in the repository

systemdが正しいコマンドを実行せずに奇妙なコマンドを実行しているようです。何ができ、どのように修正しますか?

編集済み:これは私の完全なユニットファイルです。

[Unit]
Description=Run redis replication
After=docker.service
Requires=docker.service

[Service]
Restart=always
RestartSec=10s
EnvironmentFile=/etc/vax/credentials
EnvironmentFile=/etc/vax/centos-ip
EnvironmentFile=/etc/vax/docker-auth
EnvironmentFile=/etc/vax/cluster-prefix
ExecStartPre=-/usr/bin/docker kill redisrep
ExecStartPre=-/usr/bin/docker rm redisrep
ExecStartPre=/usr/bin/docker pull "$DOCKER_USERNAME/redis-replication:latest"
ExecStart=/usr/bin/docker run --rm --name redisrep    -v /var/data/myproject/redis:/data    -e S3_ACCESS_KEY=$S3_ACCESS_KEY    -e S3_SECRET_KEY=$S3_SECRET_KEY    -e S3_BUCKET=$S3_BUCKET    -e BACKUP_PREFIX=$BACKUP_PREFIX    -e REPLICATE_FROM_IP=$CENTOS_IP    -e REPLICATE_FROM_PORT=6379    $DOCKER_USERNAME/redis-replication:latest
ExecStop=/usr/bin/docker kill redisrep

[X-Fleet]
MachineMetadata="machineIndex=1"

答え1

いくつかの調査の最後に、systemdサービスファイルのExecStart定義に引用符を使用しても問題ありません。シェル変数を使用している場合、空白以外の文字が変数自体に関連付けられている場合は、中かっこを使用して変数名の終わりを明確にする必要があります。

上記の場合、システムは$DOCKER_USERNAME/redis代わりに変数名を処理する必要があります$DOCKER_USERNAME。中かっこを追加すると正しく説明されます。

編集する:systemdで使用できる構文の詳細については、こちらをご覧ください。http://www.freedesktop.org/software/systemd/man/systemd.service.html#Command%20lines

基本的に、パイプ演算子を除いて、ほとんどのシェル表記は大丈夫です。

答え2

ExecStartサービス単位ファイルのキーを参照し、次のコマンドラインを実行するのが困難になりました。

IFS=$'\n'; f=($(ls $HOME/bk.d/DuckieTV*.backup | tail -n +2)); echo "${f[@]}"

システム化された引用規則を使用してこれを参照し、その過程で学んだことを説明します。 POSIXシェルの引用規則に従うので複雑に見えますが、実際にはもっと簡単です。これはExecStart正しく引用されたディレクティブです。

ExecStart=/bin/bash -c 'IFS=$$\'\\n\'; f=($$(ls ${HOME}/bk.d/DuckieTV*.backup | tail -n +2)); echo \"$${f[@]}\"'

または

ExecStart=/bin/bash -c "IFS=$$\'\\n\'; f=($$(ls ${HOME}/bk.d/DuckieTV*.backup | tail -n +2)); echo \"$${f[@]}\""

したがって、引用規則は次のようになります。

  1. 単一パラメータとして扱う文字列を一重引用符で囲みます('')または二重引用符(" ")。終値が時価と同じであれば、どちらを選択しても同じように扱われます。
  2. 文字列を左から右にスキャンして置き換えます。'そして\ 'そして\"そして$そして$$

systemdで変数置換を実行するために引用しないでください。$しかし、systemdは処理しません$varそして${var}同じ。すべて環境値に置き換えられます。変わりやすいしかし、単語の分割は各場合によって異なります。$var、置き換えられた値変わりやすい、単語はスペースに分割されますが、${var}単語分割はありません。実際にsystemdハンドル$varPOSIXシェルに似ていますが、次のことを処理します。${var}POSIXシェルとして"$var"

関連情報