Cách viết tệp systemd .service chạy systemd-tmpfiles


16

Tôi cần chạy systemd-tmpfiles --createtrong quá trình khởi động với một bản phân phối systemd. Vì vậy, tôi cần phải tạo một tệp systemd .service thực hiện công việc này.

Trong câu hỏi này, bạn có thể đọc tất cả các chi tiết về những gì tôi cần và tại sao: systemd-tmpfiles hoạt động như thế nào?

Tôi đã đọc một số tài liệu về nó và tôi đang viết bài kiểm tra sau:

[Unit]
Description=Execute tmpfiles to disable usb-wakeup # see details in the link above
Requires=multi-user.target # see details in the link above
After=multi-user.target    # see details in the link above

[Service]
Type=oneshot
ExecStart=/usr/bin/systemd-tmpfiles --create

[Install]
WantedBy=multi-user.target

Nhưng tôi không chắc lắm, vì systemd-tmpfileskhông phải là một chương trình đơn giản mà là một phần của chính systemd. Tôi sẽ không muốn phá vỡ hệ thống của tôi.

Bất kỳ lời khuyên về một tập tin dịch vụ chính xác?


Kiểm tra tài liệu phong phú về systemd tại freedesktop.org/wiki/Software/systemd . Bạn có thể ghi đè mặc định của hệ thống bằng các tệp của riêng bạn.
vonbrand

Câu trả lời:


30

[Điều này không trực tiếp giải quyết vấn đề của systemd-tmpfiles nhưng tôi nghĩ rằng bạn đã nhận ra rằng trong trường hợp cụ thể này, bạn nên sử dụng echo.

Đầu tiên, "multi-user.target" có thể hoặc không thể là thứ bạn muốn sử dụng. Nếu bạn đã quen thuộc với khái niệm runlevels từ công cụ khởi động kiểu SysV, thì nhiều người dùng là hệ thống tương đương với runlevel 3, là một hệ thống nhiều người dùng khởi động lên bàn điều khiển, không phải GUI. Tương đương với runlevel 5, khởi động cho X, là đồ họa . Mặc định được xác định bởi một liên kết tượng trưng trong /etc/systemd/system(và / hoặc /lib/systemd/system; một trong /etcsẽ ghi đè lên một trong /lib) được gọi là default.target , sử dụng ls để tìm vị trí của nó:

»ls -l /etc/systemd/system/default.target
default.target -> /usr/lib/systemd/system/multi-user.target

Đối với máy tính để bàn linux bình thường, đây sẽ là đồ họa. Điều này thực sự không quan trọng nếu bạn muốn dịch vụ khởi động mà bạn đang tạo bắt đầu bất kể runlevel / target mặc định là gì - trong trường hợp đó, chúng ta chỉ có thể sử dụng default.target và không lo lắng đó là bí danh để làm gì. Tuy nhiên, nếu bạn sử dụng nhiều người dùng và mặc định của bạn là đồ họa, dịch vụ của bạn sẽ không xảy ra.

Tùy thuộc vào dịch vụ, có thể có các mục tiêu hoặc dịch vụ phù hợp và cụ thể hơn mà bạn muốn bắt đầu mục tiêu này liên quan đến. Dựa trên câu hỏi khác của bạn, default.target có thể tốt. Lưu ý, điểm khác biệt giữa "mục tiêu" và "dịch vụ" là dịch vụ chứa một [Service]phần thực sự chạy một quy trình; một mục tiêu chỉ là một cách để nhóm các dịch vụ lại với nhau thông qua các chỉ thị "phụ thuộc" và "yêu cầu" khác nhau; nó không làm bất cứ điều gì của riêng mình ngoài việc kích hoạt các mục tiêu hoặc dịch vụ khác.

Khi một dịch vụ bắt đầu được xác định bởi những gì các dịch vụ khác phụ thuộc rõ ràng vào nó. Trong trường hợp một sự kiện đơn giản, độc lập như thế này mà chúng tôi muốn chạy muộn trong quá trình khởi động, chúng tôi có thể sử dụng kết hợp các chỉ thị này:

[Unit]
After=default.target

[Install]
WantedBy=default.target

Phần "Cài đặt" được sử dụng khi dịch vụ được cài đặt; "WantedBy" chỉ định mục tiêu chúng tôi muốn bao gồm dịch vụ này (có nghĩa là nó sẽ chạy nếu mục tiêu đó thực hiện, nhưng nb. Điều này không xác định khi nào nó sẽ chạy trong mối quan hệ với người khác ). Vì chúng tôi thực sự muốn dịch vụ này chạy muộn hơn là sớm hơn, sau đó chúng tôi chỉ định mệnh đề "Sau". Điều này thực sự không cần phải giống như mục tiêu WantedBy (thường là không) và có thể được bỏ qua hoàn toàn nếu bạn không quan tâm khi nó xảy ra; Tôi chỉ sử dụng nó với linh cảm rằng hầu hết các công cụ khác sẽ được chạy liên quan đến công cụ ở đâu đó bị xiềng xích với thứ gì đó đã chỉ định Before=default.target(mà chúng tôi cũng có thể đã sử dụng; muốn của mục tiêu được đánh giá trước khi mục tiêu được chạy).

Ví dụ, tôi sẽ chỉ lặp lại "hello world" với bảng điều khiển. Bản thân dịch vụ được mô tả trong [Service]phần:

[Service]
Type=forking
ExecStart=/usr/local/bin/helloworld

Lệnh cần một đường dẫn đầy đủ. Lý do tôi không chỉ sử dụng /usr/bin/echo "hello world"là nó sẽ không hoạt động (đầu ra là / dev / null, tôi nghĩ vậy), và trong khi một dịch vụ thực hiện theo echo "hello world" > /dev/consoleý muốn, thử nghiệm chứng minh rằng sử dụng chuyển hướng shell trong chỉ thị ExecStart sẽ không . Vì vậy, / usr / local / bin / helloworld là một tập lệnh shell với một dòng đó , echo "hello world" > /dev/console.

Lưu ý Type=forking, cần thiết cho một kịch bản shell.

Hoàn tất, tập tin dịch vụ tối thiểu của chúng tôi chỉ là những người ba phần ( [Unit], [Service][Install]). Để cài đặt, đặt tệp hoặc một liên kết tượng trưng đến nó trong / etc / systemd / system hoặc / usr / lib / systemd / system và:

systemctl --system enable helloworld

Nó nên in ln -s .... Điều này không chạy dịch vụ, nó chỉ cấu hình nó để chạy khi khởi động như đã thảo luận ở trên.

Đó là một cách ngắn gọn. man systemd.unitman systemd.servicecó nhiều chi tiết hơn.


1
Cảm ơn bạn, câu trả lời rất hữu ích và vấn đề được giải quyết. Chỉ cần một lưu ý, trong distro của tôi (Chakra Linux) default.targetkhông có trong /etc/systemd/system, nhưng nó chỉ ở/usr/lib/systemd/system
Eang

Đầu ra từ các lệnh được ghi lại (nơi khác có thể đi)?
vonbrand

Các tập tin / usr / lib / systemd / ... là dự phòng (mặc định), bạn có nghĩa vụ phải thả tập tin của bạn vào / etc / systemd / ...
vonbrand

Những ngày này default.targetcó thể được tìm thấy trong/lib/systemd/system/default.target
czerasz

1
@czerasz Tôi nhận thấy trên Fedora 27, nếu tôi systemctl set-default ...để lại một liên kết tượng trưng /etc/systemd/system, nhưng nó không thay đổi liên kết trong /lib, tức là, chúng chỉ vào các mục tiêu khác nhau, nhưng những thứ trước đây sẽ ghi đè lên mục tiêu sau. Nếu bạn tự đặt nó là những gì có thể xảy ra. Dù sao, tôi đã chỉnh sửa ở cả hai địa điểm.
goldilocks

2

Đối với dịch vụ systemd-tmpfiles: nó sẽ được phân phối cùng với bản phân phối của bạn, nhưng bạn luôn có thể lấy tệp dịch vụ từ kho git ngược dò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.