Cách gỡ lỗi đơn vị systemd ExecStart


12

Tôi tò mò liệu tôi có thể in ra ExecStart/ExecStopdòng lệnh mở rộng hoàn toàn không . Xem xét ví dụ sau:

ExecStart=/usr/bin/java $OPTS_COMMON $OPTS $OPTS_LOG $OPTS_DEBUG some.class.Start --param1 ${PARAM1} --param2 ${PARAM2}

Tôi đang có các dòng lệnh khá dài với rất nhiều biến môi trường liên quan. Nếu một số biến trở thành sai (ví dụ: bằng cấu hình thả vào), dịch vụ có thể không bắt đầu. Tuy nhiên tôi không thấy dòng mở rộng hoàn toàn với envs được thay thế ở bất cứ đâu và tôi đấu tranh để tìm ra cái gì sai.

Tôi không gặp may trong việc này và cho đến nay khả năng duy nhất tôi tìm thấy là sửa đổi tệp đơn vị để chạy /usr/bin/echothay vì chính dịch vụ. Nhưng đó là một chút mệt mỏi. Hoặc thậm chí nhiều giải pháp khó chịu hơn - kiểm tra từng biến môi trường từng cái một.

Có cách nào để buộc systemd chỉ cho tôi những gì thực sự cố gắng chạy không?

Câu trả lời:


9

Thật không may, không có cách xây dựng. Để xem ExecStart cuối cùng, bạn có thể bật gỡ lỗi. Chỉnh sửa các tập tin /etc/systemd/system.confvà thiết lập LogLevel=để debug. Sau đó, bạn sẽ thấy một cái gì đó như:

java.service About to execute: /usr/bin/java $OPTS_COMMON...Điều này không giải quyết được vấn đề của bạn nhưng thật tốt khi thấy sự thay thế của trình xác định hệ thống. https://www.freedesktop.org/software/systemd/man/systemd.unit.html(specifier)

Nhưng nếu bạn thực sự muốn đi đến tận cùng của sự thay thế đối số, bạn cần xem tại đây: https://github.com/systemd/systemd/blob/7ce9cc154576e342015ables8c1500790a9ededc01/src/core/execute.c#L2570


Tôi hơi sợ rằng không có cách nào để làm điều đó. :/ Dẫu sao cũng xin cảm ơn.
thu

2

Trong tệp * .service trong phần [Dịch vụ]

ExecStartPre=/bin/bash -l -c 'echo "$OPTS_COMMON">/tmp/options.debug'
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.