Làm cách nào để chạy tập lệnh khi khởi động trên Ubuntu Server 17.10?


13

Làm cách nào để chạy tập lệnh khi khởi động trên máy Ubuntu Server 17.10? Tôi nghĩ rằng phương pháp đã được thay đổi trong 17.10.

Câu trả lời:


14

Đặt tập lệnh vào cronbảng người dùng thích hợp (ví dụ: crontab ) với lịch biểu là @reboot.

Một người dùng có thể chỉnh sửa cronbảng của nó với crontab -e.

Một ví dụ sẽ chạy /path/to/script.shkhi khởi động:

@reboot /path/to/script.sh

Nếu bạn cần chạy nó dưới quyền root, đừng sử dụng @reboot sudo /path/to/script.sh;
sử dụng sudo crontab -eu rootđể chỉnh sửa crontab của root.

Xem thêm: crontab (1), cron (8), crontab (8)


2

Ubuntu 15.04 và chuyển tiếp theo mặc định sử dụng một cái gì đó gọi systemdlà chương trình (thuộc loại) tự động hóa các dịch vụ và quy trình khởi động. Bạn có thể tự làm và thêm nó vào danh sách các dịch vụ khởi động chỉ với một chút nỗ lực.

Dịch vụ Systemd cơ bản

Đây là một .servicetệp barebones có thể được sử dụng để khởi chạy máy chủ python gui của tôi (có thể là một tập lệnh shell, nó không thành vấn đề):

[Unit]
Description=Python GUI Server

[Service]
ExecStart=/home/pi/software/GUI_POE.py &

[Install]
WantedBy=multi-user.target

Các Descriptiontùy chọn là bất kỳ chuỗi mô tả các dịch vụ là gì hay không.

Các ExecStarttùy chọn xác định lệnh để thực thi. Ở đây, tôi đưa ra một đường dẫn đến một kịch bản python thực thi và sử dụng &mã thông báo để chạy nó trong nền.

Các WantedBytùy chọn quy định cụ thể ưu tiên, dựa trên những gì mục tiêu muốn sử dụng dịch vụ này. Nếu bạn không cần dịch vụ của mình để chạy vào bất kỳ thời điểm cụ thể nào, thì hãy đặt nó thành multi-user.target.

Thủ tục cơ bản

  1. Viết kịch bản bạn muốn chạy khi khởi động bằng cách sử dụng nanohoặc bất kỳ trình soạn thảo nào bạn chọn. Hãy chắc chắn rằng bạn bao gồm shebang thích hợp ở đầu tệp ( #!/bin/bashđối với tập lệnh bash) và cung cấp cho nó quyền thực thi với chmod.

  2. Chỉ cần viết dịch vụ của bạn vào một tệp có tên my_service.service và sau đó sao chép nó vào directoy thích hợp với cp my_service.service /lib/systemd/system/.

  3. Bắt đầu dịch vụ của bạn : sudo systemctl start my_service.service. Điều này khởi chạy bất cứ kịch bản nào bạn đã nói với dịch vụ của bạn để chạy. Lệnh tương tự với "stop" thay vì bắt đầu sẽ tắt nó.

  4. Thêm dịch vụ của bạn vào quá trình khởi động : sudo systemctl enable my_service.service. Để loại bỏ nó, chỉ cần thay thế "enable" bằng "vô hiệu hóa" trong cùng một lệnh.

Và đó là nó! Hãy nhớ rằng tập lệnh của bạn sẽ tự động được chạy với quyền root, vì đó là mặc định trong các dịch vụ systemd.

Ví dụ đơn giản của tôi (Đầy đủ)

Để tham khảo, đây là một dịch vụ systemd đơn giản mà tôi có để khởi chạy Máy chủ GUI Python đơn giản bằng Dash:

[Unit]
Description=Python GUI Server
After=network-online.target

[Service]
Type=simple
WorkingDirectory=/home/pi/software
ExecStart=/home/pi/software/GUI_POE.py &
Restart=always
RestartSec=15s
KillMode=process
TimeoutSec=infinity
User=pi
Group=pi

[Install]
WantedBy=multi-user.target

Dịch vụ ví dụ này sử dụng tập lệnh Python3 nhưng công thức hoàn toàn giống với tập lệnh shell.

Đọc thêm có thể được tìm thấy tại hướng dẫn tuyệt vời này của DigitalOcean và chủ đề AskUb Ubuntu này với một câu trả lời tuyệt vời đã giúp tôi học systemd. Hi vọng điêu nay co ich!


2
Cảm ơn bạn đã mang đến một viễn cảnh systemd cho câu hỏi này! Tôi sẽ chỉ ra rằng không có nhu cầu thực sự để buộc nền trong dòng ExecStart.
Jeff Schaller
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.