Systemd không thể bắt đầu tập lệnh?


9

Tôi có một BASH-script tôi muốn chạy khi khởi động. Hệ thống của tôi đang chạy systemd vì vậy tôi đã tạo một tệp .service với những gì tôi nghĩ là thông tin cần thiết:

[Unit]
Description=My Script
After=network.target

[Service]
ExecStart=/home/myscript.sh

[Install]
WantedBy=multi-user.target

Tôi đã sử dụng systemctl enable để 'đăng ký' nó được khởi động lại. Khi khởi động, tôi được cho biết kịch bản của mình sẽ được thực thi, nhưng tôi không thể thấy bất kỳ thông báo nào mà ECHO sẽ hiển thị trên màn hình cũng như không ghi gì vào tệp, theo những gì tôi đã viết trong kịch bản. Ngoài ra, nó không khởi động ứng dụng mà nó được cho là bắt đầu.

Trạng thái Systemctl cho tôi biết rằng tập lệnh đã chạy và thoát thành công. Tuy nhiên, kịch bản không có hiệu lực. Nếu tôi chạy script từ shell, nó hoạt động hoàn toàn tốt.

Có ai trong số các bạn biết những gì có thể là vấn đề của tôi?


3
Rõ ràng, nếu tập lệnh của bạn bắt đầu một cái gì đó khác, nó cần "Type = forking" Tôi cảm thấy hơi ngu ngốc vì đã không làm hỏng các cài đặt trước đó.
TokyoMEWS

1
+1 để giải quyết nó. Vui lòng gửi giải pháp của bạn dưới dạng câu trả lời và chấp nhận nó để giúp đỡ những người khác có cùng vấn đề.
terdon

1
@TokyoMEWS: Chính xác hơn, nếu tập lệnh bắt đầu một cái gì đó khác và thoát trong khi con của nó đang chạy, nó cần "Type = forking".
dùng1686

Câu trả lời:


7

Ngoài những gì TokyoMEWS tự tìm thấy ...

Rõ ràng, nếu tập lệnh của bạn bắt đầu một cái gì đó khác, nó cần "Type = forking"

(điều này không hoàn toàn chính xác - Type=forkingchỉ trở nên cần thiết nếu tập lệnh của bạn thoát trong khi các phần tử con của nó đang chạy )

... các vấn đề khác có thể là:

  1. Tôi đoán rằng bằng cách "hiển thị trên màn hình", bạn có nghĩa là kịch bản chỉ đơn giản là viết một cái gì đó cho thiết bị xuất chuẩn. Điều này không đi đến màn hình trong khi khởi động - thay vào đó, mọi thứ từ thiết bị xuất chuẩn của dịch vụ được gửi đến tạp chí (hoặc để nhật ký hệ thống tùy thuộc vào phiên bản hệ thống của bạn).

  2. Nếu bạn thực sự đã cố gắng ghi vào màn hình (ví dụ như sử dụng echo Hi >/dev/tty1), thì rất có thể đầu ra của tập lệnh sẽ biến mất khi agetty xóa màn hình trước khi hiển thị lời nhắc đăng nhập. (Để tránh điều đó, bạn sẽ phải đặt hàng đơn vị After=getty@tty1.service).

  3. Để ghi một cái gì đó vào một tập tin, bạn cần phải có hệ thống tập tin gắn đọc-ghi. Đối với điều này, After=local-fs.target có thể là cần thiết, nếu không thì thiết bị lại có thể được bắt đầu quá sớm. Nhưng điều này phụ thuộc vào cấu hình hệ điều hành cụ thể.


1

Nếu tập lệnh của bạn cũng xác định mệnh đề ExecStop , bạn cần đặt " RemainAfterExit = yes" để tránh ExecStop được gọi tự động sau ExecStart . Điều này sẽ cho phép dịch vụ của bạn ở trạng thái " hoạt động " sau khi thực hiện lệnh ExecStart .

[Service]
ExecStart=/home/myscript.sh start
ExecStop=/home/myscript.sh stop
RemainAfterExit=yes
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.