Cách sử dụng quote và Dollarign với systemd


7

Tôi đang sử dụng điều này trong một dịch vụ khai báo: ExecStartPre=/usr/bin/docker pull "$DOCKER_USERNAME/redis-replication:latest"

Trong nhật ký của systemd, tôi có thể thấy điều này khi tôi cố gắng khởi động dịch vụ:

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

Có vẻ như systemd đã không thực thi lệnh thích hợp nhưng một số lạ. Nó có thể là gì và làm thế nào để sửa nó?

Đã chỉnh sửa : Đây là toàn bộ tệp đơn vị của tôi

[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"

Đăng toàn bộ tập tin đơn vị.
Michael Hampton

Tôi không nghĩ bạn nên sử dụng dấu ngoặc kép ở đó.
Michael Hampton

1
Tôi xóa dấu ngoặc kép và lỗi vẫn như cũ. Chỉ cần lưu ý rằng lỗi được khắc phục nếu tôi thay đổi $ DOCKER_USERNAME thành $ {DOCKER_USERNAME}

Gạch dưới có lẽ là vấn đề, sau đó.
Michael Hampton

Có hướng dẫn cơ bản về cách sử dụng biến môi trường trong tệp dịch vụ systemd không? Tôi đang ở một số thử nghiệm và lỗi cho đến nay.

Câu trả lời:


8

Sau một số nghiên cứu xung quanh, tôi thấy rằng sử dụng trích dẫn trong định nghĩa ExecStart của tệp dịch vụ systemd là ổn. Đối với việc sử dụng biến shell, cần sử dụng dấu ngoặc nhọn để làm rõ nơi tên biến kết thúc khi các ký tự không phải khoảng trắng được kết nối với chính biến đó.

Trong trường hợp trên, hệ thống phải được coi $DOCKER_USERNAME/redislà tên biến thay vì $DOCKER_USERNAME. Thêm một dấu ngoặc nhọn sau đó nó được giải thích chính xác.

Chỉnh sửa : Thông tin thêm về cú pháp nào là ổn với systemd có thể được tìm thấy ở đây: http://www.freedesktop.org/software/systemd/man/systemd.service.html#Command%20lines

Về cơ bản hầu hết các ký hiệu vỏ là ok, ngoại trừ các nhà khai thác đường ống.


Điều này không nên được báo cáo với systemd? Họ rõ ràng đang sử dụng cú pháp biến giống như shell nhưng họ chuyển hướng từ cú pháp một chút, điều này rất có thể vô tình.
Pavel imerda

3
Ngoài ra, bạn vui lòng thêm một ví dụ về cú pháp được systemd chấp nhận để câu trả lời rõ ràng cho những người đọc bình thường tìm thấy câu trả lời này bằng một tìm kiếm trên web?
Pavel imerda

Cảm ơn, tôi đã thêm liên kết nơi người đọc có thể đọc thêm về cú pháp tệp dịch vụ systemd. Mặc dù câu hỏi này là cụ thể về trích dẫn và Dollarign và tôi nghĩ rằng câu trả lời của tôi đã xóa nó.
Phương Nguyễn

2

Tôi vừa đấu tranh để trích dẫn và chạy dòng lệnh sau trong ExecStartkhóa của tệp đơn vị dịch vụ:

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

Tôi sẽ trích dẫn nó bằng cách sử dụng các quy tắc trích dẫn systemd, và sau đó tôi sẽ giải thích những gì tôi đã học được trong quá trình này. Nó có vẻ phức tạp bởi vì chúng tôi hy vọng nó tuân theo các quy tắc trích dẫn của vỏ POSIX, nhưng trên thực tế, nó thậm chí còn đơn giản hơn. Đây là ExecStartchỉ thị, trích dẫn đúng

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

hoặc là

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

Vì vậy, các quy tắc trích dẫn:

  1. Gửi kèm theo chuỗi được coi là một đối số duy nhất trong dấu ngoặc đơn ( '' ) hoặc dấu ngoặc kép ( "" ). Chúng được đối xử như nhau, không quan trọng bạn chọn cái nào, miễn là trích dẫn kết thúc giống như trích dẫn mở đầu
  2. Quét chuỗi từ trái sang phải, thay thế ' bằng \' , " bằng \"$ bằng $$

Nếu bạn muốn systemd thực hiện thay thế biến, thì đừng trích dẫn $ , nhưng systemd không coi $ var$ {var} là như nhau. Cả hai đều được thay thế bằng giá trị môi trường của var , nhưng việc chia tách từ sẽ khác nhau trong từng trường hợp: với $ var , sau khi thay thế giá trị của var , các từ sẽ được phân tách trên khoảng trắng, trong khi với $ {var} sẽ không có tách từ. Thực tế, systemd coi $ var như một vỏ POSIX sẽ làm, nhưng nó xử lý $ {var} như một vỏ POSIX sẽ xử lý "$ var" .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.