Làm cách nào để chạy tập lệnh của tôi sau khi SuSE khởi động xong?


7

Tôi muốn máy chủ của mình thông báo cho tôi (thông qua tiếng gầm gừ) rằng (quá trình khởi động lại) đã kết thúc. Tôi có tệp php gửi gầm gừ sẵn sàng nhưng tôi không biết tôi nên thêm dòng nào vào.

Tập tin nào tôi cần để thêm mã của mình để nó chỉ được chạy sau khi khởi động xong SuSE?

Câu trả lời:


5

Cú pháp mới hơn cho Suse Linux Enterprise 11 SP2 (và openSUSE?)

Cách tốt nhất là tạo một tập lệnh shell sẽ gọi tập lệnh PHP của bạn. Kịch bản shell này nên có trong tiêu đề của nó bình luận sau:

#!/bin/sh
### BEGIN INIT INFO
# Provides:          nothing
# Required-Start:    $all
# Default-Start:     3 5
# Default-Stop:      4
# Short-Description: single_line_description
# Description:       multiline_description
### END INIT INFO

Bạn có thể tìm thấy một mẫu điển hình (với vô số ý kiến ​​giải thích) trong /etc/init.d/skeleton. Mẫu này bao gồm mã cần thiết để móc kịch bản PHP của bạn. Bạn sẽ thấy một trường hợp bắt đầu mà bạn sẽ phải gọi tập lệnh PHP của mình.
Tôi đã loại bỏ một số tham số tùy chọn trong tiêu đề vì nó không xuất hiện mà bạn sẽ cần chúng.

Quan trọng
Điều quan trọng là sử dụng bộ xương ít nhất là câu lệnh tình huống (xem hành động init script ) và để thực hiện ít nhất trường hợp bắt đầu. Trong trường hợp bắt đầu, đó là nơi để gọi kịch bản của bạn.

Bạn có thể tìm thấy ở đây một ví dụ tập lệnh nhỏ sẽ được gọi ở cuối boot: xem Gist của tôi . Tôi đặt một mức chạy không hợp lệ cho Dừng mặc định, nhưng bằng cách nào đó, tập lệnh vẫn được gọi trong khi tắt máy. Dù sao, mã trong trường hợp "dừng" được thực thi, không phải mã trong trường hợp "bắt đầu" trong khi tắt.

Khi bạn đã viết tập lệnh của mình, hãy sao chép tập lệnh /etc/init.dđể giả sử rằng tập lệnh init của bạn được gọi là thông báo khởi động, sau đó bạn sẽ làm (với quyền root):

chown root:root boot-notification
chmod 0750 boot-notification
mv boot-notification /etc/init.d/

Sau đó, bạn cần "đăng ký" tập lệnh trong hệ thống init. Bạn sẽ sử dụng insservlệnh (một lần nữa là root) hoặc bạn có thể sử dụng YaST:

insserv boot-notification

Sau đó, bạn có thể kiểm tra thêm rằng tập lệnh là một trong những tập lệnh cuối cùng được chạy bằng cách xem xét từng cấp độ init. Nếu bạn chọn chỉ runlevel 3, thì bạn có thể làm điều này:

ls -l /etc/init.d/rc3.d/S*

Điều này sẽ trả về một danh sách các liên kết đến init script. Liên kết đến tập lệnh của bạn phải ở cuối (hoặc gần nó) của danh sách.

Lưu ý: Nếu bạn muốn chơi xung quanh với cách viết init script năng động hơn, tôi khuyên bạn nên đọc 2 trang này:


Tôi đã không làm theo các bước của bạn 100%. Tôi chỉ sử dụng các tiêu đề mới của bạn cho tập lệnh và bây giờ tôi có thể xem mô tả trong yast. Vấn đề của tôi là kịch bản được kích hoạt trước khi khởi động lại và sau. Tôi không muốn nó xảy ra trước đây.
Radek

YaST có lẽ đã thêm đoạn script vào init init và shutdown. Nếu bạn sử dụng bộ xương (kiểm tra liên kết openSuse, nó chứa đơn giản hơn, hãy xem trong phần 'Hành động'). Bạn phải chắc chắn rằng khi bắt đầu được gọi, bạn gọi tập lệnh PHP của bạn. Khi dừng lại được gọi, bạn không gọi nó. Hoặc bạn cũng có thể sử dụng giải pháp @ Petr-Uzel, sau đó bạn chỉ cần gọi tập lệnh PHP của mình, không cần phải áp dụng cấu trúc khung xương.
Huygens

Bạn có biết làm thế nào để kiểm tra nếu gọi tập lệnh là một phần của tắt máy init không?
Radek

1
@Radek khi tắt hoặc khởi động lại, runlevel thay đổi thành (tương ứng) 0 hoặc 6. Nếu bạn có tập lệnh trong /etc/init.d/rcn.d/K* với n bằng 0 hoặc 6, thì nó được gọi trong Việc tắt máy. Tôi đã thêm một ý chính (xem liên kết trong câu trả lời của tôi) với một tập lệnh đơn giản mà bạn có thể sử dụng lại để gọi tập lệnh PHP của mình.
Huygens

Sau khi kiểm tra, runlevel để tắt và khởi động lại là chính xác, tuy nhiên, các tập lệnh không được đặt ở đó. Nhưng trong runlevel tương ứng của họ. Vì vậy, nếu bạn đặt runlevel 3 để khởi động tập lệnh, thì trong runlevel 3 bạn sẽ thấy tập lệnh tắt máy, sự khác biệt là khi khởi động, liên kết đến tập lệnh là S <nn> <tên tệp> trong khi đối với phần tắt thì đó là K <nn> <tên tệp>
Huygens

8

(mở) SUSE sử dụng /etc/init.d/after.localcho mục đích này. Chỉ cần thêm các lệnh bạn cần được thực hiện vào tập tin đó. Lưu ý rằng điều này hoạt động tốt với init SystemV, nhưng với systemd, điều này sẽ cần AFAIK cần được giải quyết khác nhau.


2
Đây là thực thi các tập lệnh ngay sau khi khởi động máy ban đầu, không phải là kết thúc quá trình khởi động init ... AFAIK
Huygens

Vâng, tất nhiên bạn đúng, cảm ơn! Tệp chính xác là /etc/init.d/after.local. Cập nhật câu trả lời của tôi.
Petr Uzel

Tập tin mát mẻ, một cái gì đó tôi phải nhớ! +1
Huygens

1
Nó dường như không hoạt động trong openSuse kể từ 12.1: forum.opensuse.org/bloss/jdmcdaniel3/ Nhưng nhưng bài đăng trên blog này đề xuất một công việc xung quanh.
Huygens

4

Đối với OpenSUSE 12.2 (Thần chú), tập lệnh cho "sau cục bộ" phải là /etc/init.d/after-localvà bạn có thể cần bật nó thông qua systemctl, như thế này ...

Để bật /etc/init.d/after-local,

systemctl enable after-local.service

Để kiểm tra trạng thái của /etc/init.d/after-local,

systemctl status after-local.service

2

Để thêm một tập lệnh init mới là khá đơn giản trên Suse.

Cách tốt nhất là tạo một tập lệnh shell sẽ gọi tập lệnh PHP của bạn. Kịch bản shell này nên có trong tiêu đề của nó bình luận sau:

#!/bin/sh
#chkconfig: 35 99 00
#description: Notify of boot completion

Bạn có thể tìm thấy một mẫu điển hình (có vô số ý kiến ​​giải thích) trong /etc/init.d/skeleton.compatđó (một mẫu hỗ trợ cú pháp chkconfig, bạn cũng 7etc/init.d/skeletonhỗ trợ chuẩn LSB mới hơn, nhưng sẽ phức tạp hơn một chút để giải thích cho bạn cách thiết lập nó, mặc dù vậy quyền lực hơn). Mẫu này bao gồm mã cần thiết để móc kịch bản PHP của bạn. Bạn sẽ thấy một trường hợp bắt đầu mà bạn sẽ phải gọi tập lệnh PHP của mình.

Số quan trọng tôi đã cho bạn là trên chkconfig line.

  • 35: có nghĩa là tập lệnh này sẽ được gọi trong cả init 3 (chế độ bảng điều khiển, thông thường cho máy chủ) hoặc init 5 (chế độ đồ họa, phổ biến hơn cho máy tính để bàn)
  • 99: là mức ưu tiên trong cả init 3 hoặc 5. Điều đó có nghĩa là nó sẽ được gọi sau cùng. Lưu ý rằng một số tập lệnh khởi động khác có thể được gọi với mức độ ưu tiên 99.
  • 00: là ưu tiên cho tắt máy / khởi động lại. Bạn cũng có thể có một thông báo ngay khi hệ thống ngừng hoạt động.

Khi bạn đã viết tập lệnh của mình, hãy sao chép tập lệnh /etc/init.dđể giả sử rằng tập lệnh init của bạn được gọi là thông báo khởi động, sau đó bạn sẽ làm (với quyền root):

# chown root:root boot-notification
# chmod 0750 boot-notification
# mv boot-notification /etc/init.d/

Sau đó, bạn cần "đăng ký" tập lệnh trong hệ thống init. Bạn sẽ sử dụng chkconfiglệnh (một lần nữa là root):

# chkconfig --add boot-notification

Kiểm tra xem điều này đã được đưa vào tài khoản đúng chưa:

# chkconfig boot-notification
boot-notification on

Nếu bạn thấy trên, nó là tốt!
Sau đó, bạn có thể kiểm tra thêm rằng tập lệnh là một trong những tập lệnh cuối cùng được chạy bằng cách xem xét từng cấp độ init. Nếu bạn chọn chỉ runlevel 3, thì bạn có thể làm điều này:

$ ls -l /etc/init.d/rc3.d/S*

Điều này sẽ trả về một danh sách các liên kết đến init script. Liên kết đến tập lệnh của bạn phải ở cuối (hoặc gần nó) của danh sách.

Lưu ý: Nếu bạn muốn chơi xung quanh với cách viết init script năng động hơn, tôi khuyên bạn nên đọc 2 trang này:


Tôi đã tạo một tập lệnh, sao chép vào /etc/init.d và đăng ký qua yast cho runlevel 3 & 5. Bây giờ, nó được kích hoạt trước khi khởi động lại và sau khi kết thúc. Sau đó, tôi đã thêm tiêu đề bạn đề xuất nhưng nó vẫn gửi tin nhắn trước khi khởi động. Bất cứ ý tưởng làm thế nào để ngăn chặn điều đó?
Radek

OK, dường như YaST không hỗ trợ synax kế thừa. Tôi sẽ cung cấp cho bạn một câu trả lời khác với cú pháp mới nhất sau đó.
Huygens

0

Tôi thấy rằng có 2 cách để làm điều đó:

  1. Đầu tiên và quan trọng nhất là mở terminal và gõ:

sudo crontab -e

sau đó gõ

@reboot sudo <command_to_execute_at_startup>

  1. Thứ hai, bạn có thể tạo một tệp dịch vụ bằng phương pháp 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.