Debian: Làm thế nào để chạy tập lệnh khi khởi động mà không phải viết 30 dòng tập lệnh shell?


20

Tôi có một máy chủ Debian và tôi chỉ cần chạy một kịch bản khi khởi động.

Tôi đọc rằng: https://www.debian-adftime.org/article/28/Making_scripts_run_at_boot_time_with_Debian

Tôi đã nhận ngay: insserv: warning: script 'thiếu các thẻ LSB và ghi đè

vì vậy có vẻ như tôi phải thêm ngay bây giờ:

### BEGIN INIT INFO
# Provides:          scriptname
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start daemon at boot time
# Description:       Enable service provided by daemon.
### END INIT INFO

Bây giờ có vẻ điên rồ: giống như 30 dòng kịch bản chỉ để chạy một chương trình khi khởi động.

Có một công cụ cho phép làm điều đó một cách đơn giản?

Trân trọng


Đó là loại kịch bản nào? Bạn đã thử chạy nó từ /etc/rc.local chưa? Bạn có thể đặt đường dẫn đến tập lệnh trong tệp RC.local và nó sẽ được thực thi khi khởi động.
Diamant

một tập lệnh đơn giản bắt đầu một quá trình nút, bắt đầu một php, v.v ...
yarek

Tôi đếm 9 dòng, không phải 30. Và chúng là các bình luận, không phải tập lệnh shell (và không phải tập lệnh SSH).
wurtel

Chúng là các tiêu đề LSB (xem wiki.debian.org/LSBInitScripts ) và một bản tóm tắt tập lệnh khởi động LSB ở phía bắc 70 dòng (xem những thứ như github.com/fhd/init-script-template/blob/master/template ). Nếu bạn muốn thực hiện một lệnh chạy bằng tay để xử lý cho bạn khi khởi động bằng máy tính thông qua một số tệp trong / etc, thì đây có vẻ như là một buổi lễ khá công phu!
kristopolous

Câu trả lời:


29

Nếu tập lệnh của bạn là "chỉ là tập lệnh" và không khởi động trình nền, hãy xem xét sử dụng /etc/rc.local(được thực thi dưới quyền root) hoặc crontab(được thực thi với tư cách là người dùng bạn chọn).

Hai ví dụ:

  • /etc/rc.local

    #!/bin/sh -e
    #(Multiple lines of comments removed.)
    /usr/local/bin/your-script.sh
    exit 0
    
  • crontab(được chỉnh sửa qua, ví dụ, crontab -e)

    #(Multiple lines of comments removed.)
    @reboot /usr/local/bin/your-script.sh
    

Chỉnh sửa 1: Chỉ cần đọc nhận xét của bạn: Nếu tập lệnh của bạn bắt đầu trình nền, lúc nào cũng nên chạy, tôi sẽ khuyên bạn không nên sử dụng rc.localhoặc crontabthay vào đó hãy viết một (hoặc) init.dtập lệnh thích hợp . Bằng cách này, bạn / hệ thống của bạn có thể khởi động lại / tải lại / bắt đầu / dừng một cách sạch sẽ, v.v.

Chỉnh sửa 2: Bạn gọi nó là điên, nhưng LSB tagscung cấp một số giá trị: "Bằng cách ghi lại các phụ thuộc thời gian chạy cho các tập lệnh init.d, có thể xác minh thứ tự khởi động hiện tại, đặt hàng khởi động bằng các phụ thuộc này và chạy các tập lệnh khởi động trong song song để tăng tốc quá trình khởi động. " Để biết thêm chi tiết, hãy đến wiki Debian .

(Nhân tiện: Đó là một cảnh báo, vì vậy thực sự, nó tùy thuộc vào bạn, làm thế nào và phải làm gì với điều này.)


Tôi thích phiên bản crontab .. nhưng tôi không nghĩ @reboot hoạt động trên debian!
yarek

@yarek: Nó hoạt động, sử dụng cái này cho chính tôi (đối với các tập lệnh, chỉ là tập lệnh).
gf_

2
nó hoạt động, nhưng tôi nghĩ rằng nó chỉ dành cho người dùng root, vì vậy bạn phải làm@reboot root /usr/local/bin/your-script.sh
Froggiz

btw tôi đã nói về debian!
Froggiz

Tôi vẫn còn khá bối rối: cron có cho phép chạy anyscript khi máy chủ khởi động lại không, không mở phiên làm root.
yarek

0

giám sát cũng là một lựa chọn. Bạn sẽ viết lại một số dòng để bắt đầu công cụ node.js và PHP của bạn, nhưng chúng sẽ ít hơn.


0

Bạn có thể sử dụng monitd cho việc này, chỉ cần viết một số định nghĩa monit và nó sẽ bắt đầu trình nền cho bạn. Nhưng tại sao bạn không sử dụng cách phù hợp với tập lệnh LSB? Không quá khó để viết nó (bạn chỉ viết nó một lần) và đó là cách sạch nhất và có giá trị nhất để đạt được điều này.

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.