Làm cách nào để khởi động lại dịch vụ systemd của tôi khi nâng cấp phụ thuộc của nó


11

Tôi đã viết một chương trình sử dụng cơ sở dữ liệu Postgres và tôi đã viết một tệp dịch vụ systemd cho nó. Hiện tại dịch vụ của tôi đã bắt đầu khởi động tốt và nó bị dừng khi Postgres bị dừng để nâng cấp (bởi apt upgrade). Tuy nhiên, khi quá trình nâng cấp hoàn tất và Postgres được bắt đầu lại, dịch vụ của tôi không tự động bắt đầu.

Tôi có thể xác định một số phụ thuộc để dịch vụ của tôi bắt đầu lại tự động không?

Đây là trạng thái dịch vụ của tôi sau khi nó tự động bị dừng trong quá trình nâng cấp Postgres:

● tabill.service - My service
   Loaded: loaded (/srv/tabill/tabill.service; enabled; vendor preset: enabled)
   Active: inactive (dead) since Tue 2017-07-04 00:29:24 EEST; 44min ago
 Main PID: 1048 (code=killed, signal=TERM)

Lưu ý rằng tôi có thể tự khởi động lại dịch vụ một cách tốt đẹp.

Đây là tập tin dịch vụ của tôi:

[Unit]
Description=My service
Wants=nginx.service
Requires=postgresql.service
After=postgresql.service

[Service]
Type=simple
ExecStart=/srv/tabill/app/serve
Restart=always
TimeoutSec=60

[Install]
WantedBy=multi-user.target

Tôi đã thử thêm PartOf=postgresql.serviceBindsTo=postgresql.servicesau đó dừng thủ công và bắt đầu Postgres, nhưng không giúp được gì.

Tất nhiên tôi có thể loại bỏ Requires, nhưng dừng cả hai dịch vụ lại với nhau thì tốt hơn, nếu chỉ cả hai sẽ bắt đầu sao lưu.


PartOf=Nghe có vẻ là giải pháp đúng đắn. Bạn đã thử nó với Requires=loại bỏ?
meuh

@meuh Tôi đã thử ngay bây giờ với Requires=gỡ bỏ, điều đó không giúp được gì. Tôi nghĩ vấn đề là PartOf=các liên kết "dừng và khởi động lại các đơn vị", nhưng Postgres không được khởi động lại trong quá trình nâng cấp. Nó dừng lại, nâng cấp và bắt đầu.
Rennex

Thật thú vị, khi bạn làm systemctl restart postgresql, systemd nhớ để khởi động lại các dịch vụ phụ thuộc của nó một lần nữa. Có vẻ như apt, vì một số lý do, không kết hợp stopstartthay vì restart.
WGH

Câu trả lời:


13

Tôi tìm thấy câu trả lời: Tôi cần thay đổi dòng cuối cùng của tệp dịch vụ thành:

WantedBy=postgresql.service

Bằng cách này, bất cứ khi nào Postgres được khởi động, dịch vụ của tôi cũng được bắt đầu - nhưng nếu dịch vụ của tôi không thành công, điều đó sẽ không dừng Postgres.

Chỉ thị trong [Install]phần chỉ ảnh hưởng đến việc kích hoạt và vô hiệu hóa các đơn vị. Nhưng nó không đơn giản khi dịch vụ của tôi đã được kích hoạt:

# systemctl enable tabill.service
Failed to execute operation: Too many levels of symbolic links

Thông báo lỗi đã gây hiểu nhầm. Sửa nó rất đơn giản:

# systemctl disable tabill.service
Removed symlink /etc/systemd/system/tabill.service.
Removed symlink /etc/systemd/system/multi-user.target.wants/tabill.service.

# systemctl enable tabill.service
Failed to execute operation: No such file or directory

# systemctl enable /srv/tabill/tabill.service
Created symlink from /etc/systemd/system/postgresql.service.wants/tabill.service to /srv/tabill/tabill.service.
Created symlink from /etc/systemd/system/tabill.service to /srv/tabill/tabill.service.

Bây giờ dịch vụ của tôi dừng lại và bắt đầu bất cứ khi nào Postgres làm. Và tự nhiên Postgres bắt đầu khi hệ thống khởi động.

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.