Cách khởi động ứng dụng tự động khi khởi động


27

Tôi chưa quen với Linux và mong muốn bắt đầu ứng dụng (sẽ bật một đèn led cứ sau 10 giây). Tôi đã viết chương trình ứng dụng và nó đang hoạt động tốt nhưng bây giờ tôi muốn khởi động nó tự động khi khởi động.

Tài liệu ở đây nói rằng sao chép tập lệnh khởi động vào /etc/init.dthư mục và tạo một liên kết tượng trưng đến tập lệnh được sao chép trong rc.dthư mục.

Phần mở rộng và tên của các tệp script này là gì? Chúng ta có thể tự thêm liên kết tượng trưng vào rc.dhoặc có một số thủ tục cụ thể cho việc này không?

Bất kỳ đề nghị làm thế nào để đạt được nó?


Cách ưa thích để thêm tập lệnh init để khởi động thay đổi theo các bản phát hành. Một số thậm chí còn loại bỏ chúng để ủng hộ cho sự khởi đầu và systemd. Tôi không khuyên bạn chỉ nên sử dụng "&" để làm nền, vì một cái gì đó như Debian start-stop-daemonxử lý nó tốt hơn (mặc dù nó thích hợp hơn với chính chương trình). Bạn đang sử dụng bản phân phối nào? Ngoài các loại MIME trên máy tính để bàn, các phần mở rộng tệp là vô nghĩa trong * nix và ưu tiên của nó là các tệp thực thi không có.
jordanm

Nếu bạn đang sử dụng petalogix, chỉ cần làm theo tài liệu đó - không yêu cầu tên đặc biệt, chỉ cần làm như họ nói. Bạn đã thử à? Có vấn đề gì bạn đang có? (Nếu không, vui lòng chỉ định bản phân phối của bạn và giải thích những gì không hoạt động với những gì bạn đã cố gắng.)
Mat

Tôi đang sử dụng Debian miễn phí wheezy cho RPi.
hẻm núi

1
nếu bạn cần thực hiện khoảng 10 giây một lần (tức là không phải 10 giây sắc nét), bạn có thể muốn sử dụng cronthay thế.
peterph

@peterph: nhưng có vẻ như chương trình bật đèn LED cứ sau 10 giây, không phải là chương trình được thực hiện cứ sau 10 giây.
Zorawar

Câu trả lời:


19

Đây là đoạn trích từ http: //www.debian-adftime.org/articles/28 dường như trả lời câu hỏi của bạn.

Lưu ý: Trong đoạn mã ví dụ bên dưới, chỉ cần thêm một cuộc gọi đến phần " start)" để thực sự khởi chạy chương trình của bạn. Bạn có thể kiểm tra chức năng của tập lệnh mà không cần khởi động lại hệ thống: gọi nó với đường dẫn đầy đủ và cung cấp cho nó một tham số " start" hoặc " stop"

Đây là:

Debian sử dụng hệ thống init giống như Sys-V để thực thi các lệnh khi hệ thống runlevel thay đổi - ví dụ như lúc khởi động và tắt máy.

Nếu bạn muốn thêm một dịch vụ mới để bắt đầu khi máy khởi động, bạn nên thêm tập lệnh cần thiết vào thư mục /etc/init.d/. Nhiều tập lệnh đã có trong thư mục đó sẽ cho bạn một ví dụ về loại việc bạn có thể làm.

Đây là một đoạn script rất đơn giản được chia thành hai phần, mã luôn chạy và mã chạy khi được gọi với "start" hoặc "stop".

#! /bin/sh
# /etc/init.d/blah
#

# Some things that run always
touch /var/lock/blah

# Carry out specific functions when asked to by the system
case "$1" in
  start)
    echo "Starting script blah "
    echo "Could do more here"
    ;;
  stop)
    echo "Stopping script blah"
    echo "Could do more here"
    ;;
  *)
    echo "Usage: /etc/init.d/blah {start|stop}"
    exit 1
    ;;
esac

exit 0

Khi bạn đã lưu tệp của mình vào đúng vị trí, hãy đảm bảo rằng tệp đó có thể thực thi được bằng cách chạy " chmod 755 /etc/init.d/blah".

Sau đó, bạn cần thêm các liên kết tượng trưng thích hợp để làm cho tập lệnh được thực thi khi hệ thống ngừng hoạt động hoặc xuất hiện.

Cách đơn giản nhất để thực hiện việc này là sử dụng lệnh dành riêng cho Debian update-rc.d:

root@skx:~# update-rc.d blah defaults
 Adding system startup for /etc/init.d/blah ...
   /etc/rc0.d/K20blah -> ../init.d/blah
   /etc/rc1.d/K20blah -> ../init.d/blah
   /etc/rc6.d/K20blah -> ../init.d/blah
   /etc/rc2.d/S20blah -> ../init.d/blah
   /etc/rc3.d/S20blah -> ../init.d/blah
   /etc/rc4.d/S20blah -> ../init.d/blah
   /etc/rc5.d/S20blah -> ../init.d/blah

Tôi có phải thực sự đặt tập lệnh này vào etc / init.d / hoặc dòng ở trên cùng, # /etc/init.d/blah, chỉ ra một vị trí cho trình bao không?
user137717

Tôi đang nhận được "-sh: update-rc.d: không tìm thấy lệnh"
m4l490n

2
Các hệ thống mới hơn sử dụng systemdcho nhiều thứ, bao gồm cả cấu hình khởi động. Sử dụng systemctlđể kiểm soát và cấu hình systemd.
Alexander Shcheblikin

4

Cách tốt nhất là kiểm tra nguồn gói phân phối của bạn cho một dịch vụ hệ thống thông thường, ví dụ như đối với OpenSSH - bạn sẽ thấy các thông lệ tốt là gì. Rốt cuộc, một trong những lý do đằng sau nguồn mở là để có thể học hỏi từ các nguồn.


2
Lời khuyên tuyệt vời! Thực sự khôn ngoan và có liên quan, và điều chỉnh cho tất cả các Distos. (Và tình cờ trả lời "mới sang Linux" và "làm thế nào để tôi làm điều đó" một phần của câu hỏi tôi sẽ sử dụng câu trả lời này để cải thiện của tôi kịch bản bắt đầu dừng lại..
Bruce0

3

Sử dụng Trình giám sát, một chương trình hiệu quả để quản lý và ghi nhật ký các ứng dụng khởi động bằng các đối số. Tìm hiểu thêm từ http://supervisord.org/rasty.html và (Làm theo hướng dẫn cài đặt.

Tạo một tập tin conf tại /etc/supervisor/conf.d/{PROGRAM_NAME}.confvà đây là mã,

[program:{PROGRAM_NAME}]
command=/usr/bin/{PROGRAM_NAME} -arg1 -arg2
autostart=true  
autorestart=true  
stderr_logfile=/var/log/supervisor/{PROGRAM_NAME}.err.log  
stdout_logfile=/var/log/supervisor/{PROGRAM_NAME}.out.log  

Sau đó thực hiện từ dòng cmd:

supervisorctl reload


Trong khi câu trả lời của bạn là tốt, tôi nghĩ bạn nên thay đổi nó để cho thấy rằng "tải lại giám sát" sẽ được thực thi từ CLI, không được chèn vào tệp .conf
dlewin 15/03/18

3

Sử dụng crontabdễ dàng hơn nhiều.

Sử dụng crontab -eđể chỉnh sửa crontab của người dùng.
Thêm dòng sau vào cuối:

@reboot <command>

Ví dụ:

  • @reboot my_script.sh
  • @reboot python my_script.py arg1 arg2

Cuối cùng sử dụng crontab -lđể đảm bảo tập lệnh của bạn đã được thêm vào danh sách.


Tôi tự hỏi tại sao câu trả lời này nhận được downvotes? Có vẻ như một giải pháp rất đơn giản, và một giải pháp sử dụng crontab - điều mà có lẽ ai cũng biết và hiểu.
kolinko

1

Các phiên bản mới hơn của hỗ trợ linux systemd(như @AlexanderShcheblikin đã nói). Nó có nhiều tính năng hơn và dễ mang theo hơn giải pháp dành riêng cho debian.

Xin vui lòng đọc hướng dẫn thực sự tuyệt vời này .

Dưới đây là một tài liệu tham khảo nhanh về mức tối thiểu cần thiết:

  1. Một tập lệnh (ví dụ myscript.sh) với quyền thực thi.
  2. Tệp Đơn vị (ví dụ myservice.service) có phần mở rộng ".service" /etc/systemd/systemvới 644 quyền có chứa lệnh để thực thi tập lệnh. Ví dụ,

:

[Unit]
Description=Example systemd service.

[Service]
Type=simple
ExecStart=/bin/bash /path/to/myscript.sh

[Install]
WantedBy=multi-user.target
  1. Chạy lệnh sudo systemctl enable myserviceđể cho phép nó bắt đầu khởi độ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.