Làm thế nào để bạn thực hiện một dịch vụ systemd như dịch vụ cuối cùng khi khởi động?


26

Nhiều năm trước, chúng ta có thể viết kịch bản khởi động vào /etc/rc.local. Sau khi tất cả các dịch vụ hệ thống được tải, tập lệnh của bạn sẽ chạy.

Bây giờ, chúng tôi sử dụng systemd, chúng tôi không rc.localcòn nữa. Systemd bắt đầu dịch vụ song song. Bạn có thể viết dịch vụ của riêng mình để thực hiện một RC.local` nhưng bạn không thể đảm bảo nó sẽ chạy sau khi tất cả các dịch vụ hệ thống được tải.

Có cách nào để làm điều đó? Hoặc chúng ta phải sử dụng BeforeAftertrong tệp dịch vụ systemd?



5
Systemd, không bắt đầu !!
比尔

Chỉ định tên và phiên bản HĐH?
STTR

HĐH: Arch Linux, Phiên bản: Không áp dụng
比尔

1
@ 比尔 Tại sao "cuối cùng", bạn không biết sự phụ thuộc của tập lệnh, hoặc bạn muốn nó kéo dài chỉ để được an toàn?
Paul

Câu trả lời:


27

Trong systemd, nên sử dụng Before=After=đặt hàng các dịch vụ của bạn độc đáo xung quanh các dịch vụ khác.

Nhưng vì bạn đã yêu cầu một cách mà không sử dụng BeforeAfter, bạn có thể sử dụng:

Type=idle

như man systemd.servicegiải thích:

Hành vi của idlerất giống với simple; tuy nhiên, việc thực thi chương trình dịch vụ thực tế bị trì hoãn cho đến khi tất cả các công việc đang hoạt động được gửi đi. Điều này có thể được sử dụng để tránh xen kẽ đầu ra của dịch vụ shell với đầu ra trạng thái trên bàn điều khiển. Lưu ý rằng loại này chỉ hữu ích để cải thiện đầu ra của bàn điều khiển, nó không hữu ích như một công cụ đặt hàng đơn vị chung và hiệu ứng của loại dịch vụ này phải chịu thời gian chờ 5s, sau đó chương trình dịch vụ được gọi.


1
Xin chào, bạn có quan tâm đến việc xây dựng cú pháp nếu tôi sẽ sử dụng trước hay sau?
r4ccoon

Một số chủ đề khác nhau, nhưng nếu ai đó muốn chạy các quy trình người dùng tách biệt với các quy trình hệ thống, thì có Askubfox.com/a/859583/457417
Ben Creasy

làm việc một cách hoàn hảo để thiết lập /proc/sys/kernel/modules_disabledđể 1ở phần cuối của quá trình khởi động
Stuart Cardall

0

Nó thực sự phụ thuộc vào định nghĩa của bạn về "khởi động". Tôi giả sử bạn muốn nó chạy ngay lập tức sau khi getty bắt đầu. Để làm điều này, bạn cần thêm dịch vụ của bạn vào /etc/systemd/system/getty.target.wants/thư mục. Bạn cũng nên đảm bảo tệp của mình đang sử dụng mã tương tự với các dịch vụ khác trong thư mục này. Để chạy một dịch vụ tùy chỉnh khi khởi động và tắt máy (chỉ cần phát ra tiếng chuông bo mạch chủ của tôi) Tôi sử dụng đoạn mã sau trong/etc/systemd/system/getty.target.wants/service_name.service

[Unit]
After=systemd-user-sessions.service plymouth-quit-wait.service
After=rc-local.service
Before=getty.target
IgnoreOnIsolate=yes

[Service]
ExecStart=/usr/bin/myinitscript.sh start
ExecStop=/usr/bin/myinitscript.sh stop
Type=oneshot
RemainAfterExit=true

[Install]
WantedBy=basic.target

/usr/bin/myinitscript.sh là thực thi và có một shebang khi bắt đầu.

Lưu ý rằng không phải mọi thứ sẽ được bắt đầu tại thời điểm này trong khởi động, nhưng đây là điểm mà tại đó dấu nhắc đăng nhập xuất hiện cho người dùng

Mặc dù điều này không sử dụng Before=After=, nó đối với tôi dễ hiểu hơn nhiều và thực sự hoạt động; Tôi không tìm thấy câu trả lời trên đủ thông tin. Điều này cũng cho phép bạn sử dụng cả hai ExecStart=ExecStop=, thay vì bị giới hạn trong một Type=simpledịch vụ giống như.


-2

Tôi không quen thuộc với các chi tiết cụ thể hoặc ArchLinux, nhưng đây là cách quản lý systemd nói chung.

Chà, về cơ bản systemd là một tập hợp các tập lệnh trong /etc/init.d/ được trỏ bởi các liên kết tượng trưng từ /etc/rcX.d, trong đó X là số cấp độ chạy. Bản thân các liên kết có định dạng sau:

[K | S] + nn + [chuỗi]

Ở đâu:

  • nn là một số xác định thứ tự các đoạn script đó chạy
  • chuỗi là tên của tập lệnh khi nó xuất hiện trong /etc/init.d/
  • và cuối cùng K hoặc S xác định lệnh mà tập lệnh được gọi với: stop hoặc start tương ứng.

Vì vậy, nếu bạn muốn tập lệnh của mình chạy lần cuối trong chuỗi khởi động, bạn cần thực hiện như sau:

  1. đặt tập lệnh của bạn vào /etc/init.d/ và làm cho tập lệnh thực thi
  2. xác định runlevel đích mà tập lệnh sẽ bắt đầu tại (về cơ bản là 2 cho giao diện điều khiển và 5 cho giao diện người dùng đồ họa). Có thể được xác định với một cái gì đó nhưrunlevel
  3. hãy xem những tập lệnh nào đã có trong runlevel này ls /etc/rc<target runlevel>.d/và chọn một số có hai chữ số lớn hơn bất kỳ tập lệnh nào đã có.
  4. sử dụng một tiện ích dành riêng cho bản phân phối của bạn như update-rc.ddựa trên Debian hoặc chkconfiggiống như Fedora hoặc thủ công, hãy tạo một symlink /etc/rc.d/S cho tập lệnh init của bạn.

5
Những gì bạn đã mô tả thực sự là sysVinit. Mặc dù đúng là systemd tương thích với cách sysVinit hoạt động, có một điểm khác biệt chính - mọi thứ được thực hiện song song. Ngoài ra còn có hai loại dịch vụ, dịch vụ sysVinit và dịch vụ systemd. Câu trả lời của bạn có thể giúp một cái gì đó thực thi sau các dịch vụ sysVinit, nhưng không nhất thiết là các dịch vụ systemd.
Sam

1
Systemd không nhằm mục đích tương thích với sysvinit, kể từ ngày đầu tiên.
lzap
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.