Cách chạy tập lệnh trong khi khởi động với quyền root


59

Tôi đã có một tập lệnh tự động kích hoạt wifi mà không cần sử dụng trình điều khiển mạng, nhưng tôi không biết cách chạy tập lệnh dưới quyền root trong khi hệ thống đang khởi động. Làm cách nào để tập lệnh chạy tự động trong khi khởi động?


Các chương trình tự khởi động được cấu hình trong autostarttệp kê khai hoặc trong *.servicecác tệp ở một số vị trí, cũng như trong init.dhoặc crontab. Xem này: unix.stackexchange.com/a/525845/43233
Noam Manos

Câu trả lời:


54

Đặt tập lệnh bạn muốn chạy trong thư mục /etc/init.d và làm cho tập lệnh thực thi.

chmod 755 myscript

Khi đã xong, hãy tạo một liên kết tượng trưng trong thư mục cấp độ chạy mà bạn muốn sử dụng, ví dụ nếu bạn muốn chạy một chương trình trong đồ họa runlevel 2, runlevel mặc định cho Ubuntu, bạn sẽ đặt nó vào /etc/rc2.dthư mục. Bạn chỉ không thể đặt nó vào thư mục, bạn phải biểu thị khi nào nó sẽ chạy bằng cách chỉ ra phần khởi động với một S Siết và thứ tự thực hiện là quan trọng. Đặt nó sau mọi thứ khác trong thư mục bằng cách cho nó một số cao hơn.

Nếu tập lệnh cuối cùng được chạy là rc.localvà nó được đặt tên S99rc.localthì bạn cần thêm tập lệnh của mình dưới dạng S99myscript.

ln -s /etc/init.d/myscript /etc/rc3.d/S99myscript

Mỗi /etc/rc*.dthư mục tương thích ngược có các liên kết tượng trưng đến /etc/init.d/thư mục.


1
Lưu ý rằng trong Ubuntu Server 14.04, tôi cần sử dụng /etc/rc2.d, thay vì rc3.dnhư được chỉ ra trong ví dụ. Có vẻ như rc2.dkhông chỉ là mức độ chạy đồ họa.
Brad

1
cd /etc/rc`cat /etc/init/rc-sysinit.conf | grep "env DEFAULT_RUNLEVEL" | grep -oP "\d"`.dsẽ đưa bạn đến /etc/rc?.dthư mục tương ứng với runlevel mặc định của bạn.
Kevin

1
Thay vào đó: "Nếu tập lệnh cuối cùng được chạy là rc.localvà nó được đặt tên S99rc.localthì bạn cần thêm tập lệnh của mình dưới dạng S99myscript.". Ý của bạn là: "Nếu tập lệnh cuối cùng được chạy là myscriptvà nó được đặt tên S99myscriptthì bạn cần thêm tập lệnh của mình vào S99myscript." ???
Dor

6
Hãy nhớ rằng điều này sẽ không hoạt động với systemd (nghĩa là bắt đầu với Ubuntu 16.04). Xem cái này thay thế.
Alexander Revo

26

Bao gồm các lệnh trong /etc/rc.local. Nó sẽ được chạy bất cứ khi nào runlevel của người dùng thay đổi.

Lưu ý: Bạn phải đặt lệnh trước dòng cuối cùng trong /etc/rc.local có chứa: "exit 0".


3
Lưu ý: bạn phải đặt lệnh trước dòng cuối cùng /etc/rc.localcó chứa: exit 0
rubo77

3
/etc/rc.localtrong ubfox 15.10 có nhận xét rằng "Kịch bản này được thực thi ở cuối mỗi runlevel nhiều người dùng." Vì vậy, kịch bản có thể được chạy nhiều lần trong khi khởi động, phải không?
jarno

@jamo, vâng, trên mỗi runlevel. Tôi không biết làm thế nào điều này có liên quan đến việc chạy "lúc khởi động", thường có nghĩa là "chạy một lần khi khởi động".
erm3nda

17

Sử dụng một crontabtùy chọn để làm cho tập lệnh của bạn chạy sau khi khởi động lại,

bạn có thể làm điều đó bằng cách thêm @rebootmã trong cron

Mở crontab bởi người dùng root:

$ sudo crontab -e

Thêm bản ghi tiếp theo ở dưới cùng:

@reboot yourScriptPath 

Điều đó sẽ làm những gì bạn muốn.


Ý bạn là sử dụng lệnh crontab -e, không cần đặc quyền siêu người dùng? Tôi tự hỏi, nếu nó có thể chạy các kịch bản cần phải được chạy như root.
jarno

Tôi đã thử nghiệm điều này. Nó không chạy script như root.
jarno

4
Bạn phải thêm dòng trong khi chạy lệnh sudo crontab -eđể làm cho nó chạy tập lệnh dưới dạng root trong khi khởi động.
jarno

đừng quên xóa /var/run/crond.reboot, nếu không, sẽ không thực thi nhiệm vụ
Albert Català

Chỉ để ghi lại, tôi chắc chắn rằng @jarno sẽ biết điều đó rồi. Mỗi người dùng có tác vụ cron riêng của mình, vì vậy nếu bạn thêm nó vào người dùng của mình (chạy crontab -e mà không có sudo) thì tập lệnh sẽ được chạy bởi người dùng của bạn. Vì vậy, bạn cần chạy nó với quyền root để cho phép nó có thể chạy các script như root khi khởi động.
eddieferetro

9

Điều này làm việc cho tôi trên Ubuntu 17.04:

  1. tạo tập tin kịch bản du lịch như disable_cdromthuận tiện cho bạn vị trí. Trong trường hợp của tôi home/yterle/disable_cdrom. Trong trường hợp của tôi:

    #!/bin/sh
    eject /dev/sr0 -i 1
    
  2. làm cho nó thực thi chmod 775 disable_cdrom

  3. điều hướng đến /etc/systemd/systemvà tạo ra một servicetập tin Ví dụsudo gedit /etc/systemd/system/disable_cdrom.service

Tôi disable_cdrom.servicetrông như thế này:

[Unit]
Description=Disable cdrom

[Service]
Type=oneshot
ExecStart=/bin/sh /home/yterle/disable_cdrom

[Install]
WantedBy=multi-user.target

Nơi ExecStartđể chạy tập lệnh của bạn với/bin/sh

Sau đó chạy systemctl enable disable_cdrom.serviceđể kích hoạt dịch vụ systemd


1
Bỏ phiếu này là những gì tôi đang tìm kiếm, nhưng tôi nghĩ ý bạn làsystemctl enable disable_cdrom.service
KennetRunner

5

Bao gồm tệp Script của bạn /etc/init.d/ với quyền Thực thi, sau đó đặt mức chạy khác nhau

$ update-rc.d script-name default

Nó sẽ đặt tập lệnh của bạn khi khởi động khởi động.


Không hoạt động với tôi trên Kali Linux v2.0. Ý bạn là update-rc.d script-name enablesao
Sopalajo de Arrierez

update-rc.d <script-name> script shell mặc định mà bạn đã sao chép tại /etc/init.d/ <script-name>
MS Parmar

4

Tạo một tệp văn bản như thế này trong /etc/cron.d/:

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

@reboot   root    yourScriptPath

(Bạn nên thay thế yourScriptPathbằng đường dẫn đến tập lệnh bạn muốn chạy.)


1

Cẩn thận với việc thêm tập lệnh vào rc.local- Tôi bị kẹt trong màn hình giật gân vì nó. Nhấn Alt+ F1tiết lộ những gì đang diễn ra đằng sau màn hình giật gân (đoạn script rc.localđang chạy).

Tôi không thể thoát ra khỏi nó.

  • Ctrl+ Alt+ Delhoặc
  • Alt+ PrtSc+ Khoặc
  • Ctrl+ Alt+F#

không có gì hoạt động

Tôi đã phải khởi động từ hình ảnh USB Ubuntu, tìm rc.local, cấp cho mình quyền để gửi và xóa nó. Tôi đoán bạn không nên làm công cụ nếu bạn không biết những gì bạn đang làm.

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.