[Đ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 /etc
sẽ 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]
và [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.unit
và man systemd.service
có nhiều chi tiết hơn.