Câu hỏi Làm thế nào để chạy script khi khởi động?


Làm cách nào để chạy tập lệnh tự động khi Ubuntu khởi động nên tôi không phải chạy chúng theo cách thủ công sau khi khởi động?


456
2017-08-04 19:54


gốc


Nếu ai đó cũng có thể hiển thị cả WHEN và WHERE sẽ tuyệt vời ở đâu. Tôi nói điều này bởi vì tôi biết có ít nhất 2 cách để bắt đầu một tập lệnh sẽ kích hoạt trước khi các ứng dụng khác được khởi động (như X11) - Buttink
Toàn bộ chuỗi câu trả lời này là một mớ hỗn độn. Định dạng Stack Exchange dường như không phù hợp nhất cho câu hỏi này - Gabriel Fair
Nó thực sự khá thú vị. Có bao nhiêu cách khác nhau? - devios1


Các câu trả lời:


Tùy thuộc vào loại kịch bản bạn cần chạy .. Đối với các dịch vụ và những thứ tương tự bạn nên sử dụng mới nổi. Nhưng đối với một kịch bản người dùng, các tập lệnh này sẽ được khởi chạy như các tập lệnh phiên của gnome! Có một cái nhìn dưới System> Preferences> Startup Applications.

Trên một lưu ý phụ nếu bạn cần một số tập lệnh được chạy trên đăng nhập thiết bị đầu cuối, bạn có thể thêm chúng vào .bash_login trong thư mục chính của bạn.

Từ 14.04 trở lên

Một lệnh đơn giản (một lệnh không cần chạy) có thể sử dụng lệnh Upstart như:

start on startup
task
exec /path/to/command

Lưu điều này trong một .conf trong tập tin /etc/init (nếu bạn cần nó chạy như root khi hệ thống khởi động), hoặc trong ~/.config/upstart (nếu bạn cần nó để chạy với tư cách là người dùng của bạn khi bạn đăng nhập).


191
2017-08-04 23:26



Xem xét cách SO và StackExchange chạy, bạn có thể đưa ra một ví dụ về một kịch bản mới nổi và nó sẽ được đặt ở đâu không? Điều đó sẽ làm cho câu trả lời này tốt hơn nhiều. Liên kết của bạn nói rằng nó không được duy trì và nhìn vào sách dạy nấu ăn mới nổi, đó là huuuge. Tôi không có quá nhiều ý tưởng bắt đầu từ đâu. - Ehtesh Choudhury
Nếu tôi cần chạy lệnh như là root thì sao? - dopatraman
@dopatraman Câu trả lời nói rằng tất cả các quá trình với điều này được chạy dưới dạng root. - cybermonkey
Vui lòng cập nhật câu trả lời này để giải thích việc cần làm trên các hệ thống đang chạy systemd thay vì khởi động (Ubuntu 15.04+).
Câu trả lời này không có ý nghĩa với tôi. Các ứng dụng được liệt kê trong system->pref->startup applications không thể được tìm thấy trong /etc/init/ cũng không ở ~/.config/upstart. Vì thế các ứng dụng khởi động được xác định ở đâu? - Blauhirn


Một cách tiếp cận là thêm một @reboot cron bài tập:

  1. Đang chạy crontab -e sẽ cho phép bạn chỉnh sửa cron của bạn.
  2. Thêm một dòng như thế này vào nó:

    @reboot /path/to/script
    

    sẽ thực thi tập lệnh đó khi máy tính của bạn khởi động.


476
2017-08-04 19:57



Các @reboot từ khóa là một mẹo hay vì nó không được biết đến rộng rãi. - jathanism
Tốt đẹp. Bất kỳ ý tưởng chính xác khi nào điều này gây nên? - Oli♦
Vì vậy ... điều này sẽ không chạy nếu tôi mất điện và máy tính quay lại khi điện được phục hồi? - Mike Wills
@siamii: man 5 crontab nói rằng @reboot được thực hiện khi khởi động (khi cron daemon được khởi động). - jfs
Điều này thật tuyệt. Cho đến nay điều này có vẻ tốt hơn rc.local vì hệ thống dường như được thiết lập nhiều hơn bởi điểm này (PATH, v.v.). Thật kỳ lạ là rất khó để gọi điều gì đó sau khởi động hệ thống .. - Karthik T


Cách thêm lệnh vào /etc/rc.local? bạn sẽ phải sử dụng truy cập sudo để chỉnh sửa tệp này.

sudo nano /etc/rc.local

135
2017-08-05 16:40



Điều này trực tiếp trả lời câu hỏi: làm thế nào để thực hiện một số kịch bản đơn giản khi hệ thống của bạn khởi động. upstart thực hiện một nhiệm vụ phức tạp hơn: bắt đầu quá trình daemon. - Dogweather
Vì vậy, khởi động mới bắt đầu quá trình daemon trong khi /etc/rc.local bắt đầu bash script? - Donato
Đây sẽ là câu trả lời được chấp nhận ... - Android Dev
Phải không? Điều này không còn hoạt động những ngày này, phải không? - DaVince
Doenst làm việc với hệ thống Ubuntu 17.04 - qodeninja


Có nhiều cách khác nhau để tự động chạy các lệnh:

  1. Các mới nổi hệ thống sẽ thực thi tất cả các tập lệnh mà từ đó nó tìm thấy một cấu hình trong thư mục /etc/init. Các tập lệnh này sẽ chạy trong khi khởi động hệ thống (hoặc để phản hồi lại các sự kiện nhất định, ví dụ: yêu cầu tắt máy) và do đó là nơi chạy các lệnh không tương tác với người dùng; tất cả các máy chủ đều bắt đầu sử dụng cơ chế này.

    Bạn có thể tìm thấy phần giới thiệu có thể đọc được tại: http://upstart.ubuntu.com/getting-started.html trang người đàn ông man 5 init và man 8 init cung cấp cho bạn đầy đủ chi tiết.

  2. Tập lệnh shell có tên .gnomerc trong thư mục chính của bạn được tự động nguồn mỗi khi bạn đăng nhập vào một phiên GNOME. Bạn có thể đặt các lệnh tùy ý trong đó; các biến môi trường mà bạn đặt trong tập lệnh này sẽ được xem bởi bất kỳ chương trình nào mà bạn chạy trong phiên của mình.

    Lưu ý rằng phiên không bắt đầu cho đến khi .gnomerc kịch bản đã hoàn tất; do đó, nếu bạn muốn tự khởi động một số chương trình chạy dài, bạn cần phải nối thêm & để gọi chương trình, để tách nó khỏi vỏ đang chạy.

  3. Tùy chọn menu Hệ thống -> Tùy chọn -> Ứng dụng khởi động cho phép bạn xác định những ứng dụng nào sẽ được bắt đầu khi phiên đồ họa của bạn bắt đầu (Ubuntu định trước khá nhiều) và thêm hoặc xóa chúng theo sở thích của bạn. Điều này có gần như cùng một mục đích và phạm vi của .gnomerc kịch bản, ngoại trừ bạn không cần biết sh cú pháp (nhưng bạn cũng không thể sử dụng bất kỳ cú pháp nào sh lập trình xây dựng).


68
2017-08-05 14:02



3) "Điều này có cùng mục đích và phạm vi của tập lệnh .gnomerc", ngoại trừ .gnomerc dường như chạy trước tải Unity và Startup Applications dường như chạy sau Đang tải Unity. Tôi đã phải chạy một chương trình nằm trên thanh menu của Unity và nó tạo ra một sự khác biệt rất lớn trong trường hợp này! - That Brazilian Guy
@ ruda.almeida Cảm ơn bạn đã chỉ ra điều đó. Câu trả lời được viết vào những ngày trước Unity. - Riccardo Murri
sudo update-rc.d myscript.sh defaults, trong đó /etc/init.d/myscript.sh là kịch bản của bạn, cũng chạy nó lúc khởi động. - Dan Dascalescu


Từ 15.04 trở lên:

Để chạy (ngắn ngủi)1 khi khởi động bằng systemd, bạn có thể sử dụng một đơn vị systemd kiểu OneShot. Ví dụ: tạo /etc/systemd/system/foo.service chứa:

[Unit]
Description=Job that runs your user script

[Service]
ExecStart=/some/command
Type=oneshot
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

Sau đó chạy:

sudo systemctl daemon-reload
sudo systemctl enable foo.service

Về cơ bản, đây chỉ là chuyển đổi một công việc Upstart điển hình vào một hệ thống (xem Systemd cho người dùng Upstart).

Bạn có thể chạy nhiều lệnh từ cùng một tệp dịch vụ, sử dụng nhiều ExecStart dòng:

[Service]
ExecStart=/some/command
ExecStart=/another/command some args
ExecStart=-/a/third/command ignore failure

Lệnh phải luôn được cung cấp với đường dẫn đầy đủ. Nếu bất kỳ lệnh nào bị lỗi, phần còn lại sẽ không chạy. A - trước khi đường dẫn báo cho systemd bỏ qua một trạng thái thoát khác không (thay vì coi nó là một lỗi).

Liên quan, thích hợp:


Đối với phiên người dùng, bạn có thể tạo đơn vị systemd trong ~/.config/systemd thay thế. Điều này sẽ làm việc với 16.04 trở đi, nhưng không phải phiên bản cũ hơn của Ubuntu với systemd (vì những người vẫn sử dụng Upstart cho phiên người dùng). Các đơn vị phiên người dùng có thể được kiểm soát với các lệnh giống như với các dịch vụ hệ thống, nhưng với --user đã thêm tùy chọn:

systemctl --user daemon-reload
systemctl --user status foo.service

1Trái ngược với các daemon lâu đời.


53
2018-01-09 19:21



có thể đặt ưu tiên cho công việc không? hoặc xác định rằng nó phụ thuộc vào một dịch vụ khác để được bắt đầu trước? - r3wt
@ r3wt có, có nhiều cách khác nhau để làm điều đó. Các WantedBy được sử dụng ở đây, ví dụ, làm cho nó bắt đầu khi multi-user.target đạt được. Bạn có thể dùng Before, After, Requires, v.v. man systemd.unit - muru
@ PerlDuck không phải là điều duy nhất nó còn thiếu. Cảm ơn! - muru
Không có gì. - Btw, RemainAfterExit phụ thuộc vào dịch vụ bạn bắt đầu và hành vi mong muốn của nó. Ví dụ, /bin/df -h <s> sẽ </ s> nên có RemainAfterExit=no. - PerlDuck
@PerlDuck Không có gì vốn có trong df nhu cầu đó RemainAfterExit=no. Trừ khi bạn muốn thực hiện nhiều lần lệnh mỗi khi bạn chạy systemctl start foo. - muru


$HOME/.config/autostart
  • Vị trí này chứa danh sách ứng dụng khởi động.
  • .desktop tập tin có thể được đặt ở đây sẽ được thực thi khi khởi động.

Ví dụ mẫu cho .desktop tập tin:

Đặt sau .desktop trong tập tin $HOME/.config/autostart và được chmod +x:

[Desktop Entry]
Type=Application
Exec="</path/to/script>"
Hidden=false
NoDisplay=false
X-GNOME-Autostart-enabled=true
Name=Startup Script

Đây "</path/to/script>" được thay thế bằng đường dẫn đến script.sh
(thường được đề nghị để /usr/local/bin điều đó có thể được thực hiện bằng lệnh trực tiếp myscript thay thế bằng "</path/to/script>").

Ví dụ mẫu về script.sh:

#!/bin/bash
<commands to be executed>
exit

Kết quả: .desktop tệp sẽ được khởi chạy từ $HOME/.config/autostart thực thi kịch bản bởi Exec=

Do đó, bạn có thể chạy kịch bản shell mong muốn của bạn khi khởi động!


22
2017-07-20 06:14





Đối với những điều đơn giản, bạn có thể thêm một lệnh vào Hệ thống-> Tùy chọn-> Phiên trỏ đến vị trí của tập lệnh của bạn.

Hoặc bạn có thể thêm nó vào /etc/init.d/rc.local hoặc tạo một mới nổi công việc nếu đó là một cấp thấp đồ đạc.

Hãy xem https://help.ubuntu.com/community/UbuntuBootupHowto để biết thêm thông tin


18
2017-08-04 19:59





Bạn nên sử dụng mới nổi cho điều này. Upstart được sử dụng cho các quá trình Ubuntu được tự động bắt đầu. Nó là một giải pháp nâng cao như các tập lệnh init.d cũ của System-V. Nó cũng cho phép bạn đưa vào các điều kiện tiên quyết để bắt đầu tập lệnh của mình (tức là bạn có cần mạng đang chạy không? V.v.)


5
2017-08-04 19:58





cron câu trả lời được thực hiện khác với bình chọn hàng đầu

Câu trả lời này vẫn sử dụng cron nhưng sử dụng một phương pháp khác với câu trả lời bình chọn hàng đầu. Điều này hoạt động từ Ubuntu 16.04 nhưng có lẽ được hỗ trợ sớm hơn nhiều. Chỉ là tôi bắt đầu sử dụng cron để chạy công việc khi máy tính khởi động từ 16.04.

Khi nào cron chạy?

Trong bình luận ai đó hỏi "khi nào họ chạy?". Bạn có thể nói trong syslog / journalctl:

$ journalctl -b | grep cron
Jan 02 16:54:40 alien cron[919]: (CRON) INFO (pidfile fd = 3)
Jan 02 16:54:40 alien cron[919]: (CRON) INFO (Running @reboot jobs)
Jan 02 16:54:40 alien systemd[1]: Started Run anacron jobs.
Jan 02 16:54:40 alien anacron[949]: Anacron 2.3 started on 2018-01-02
Jan 02 16:54:40 alien anacron[949]: Normal exit (0 jobs run)
Jan 02 16:54:40 alien CRON[952]: pam_unix(cron:session): session opened for user root by (uid=0)
Jan 02 16:54:40 alien CRON[954]: pam_unix(cron:session): session opened for user root by (uid=0)
Jan 02 16:54:40 alien CRON[951]: pam_unix(cron:session): session opened for user root by (uid=0)
Jan 02 16:54:40 alien CRON[950]: pam_unix(cron:session): session opened for user root by (uid=0)
Jan 02 16:54:40 alien CRON[985]: (root) CMD (   /usr/local/bin/cron-reboot-cycle-grub-background)
Jan 02 16:54:40 alien CRON[954]: pam_unix(cron:session): session closed for user root
Jan 02 16:54:40 alien cron[919]: sendmail: Cannot open smtp.gmail.com:587
Jan 02 16:54:40 alien CRON[952]: pam_unix(cron:session): session closed for user root
Jan 02 16:54:40 alien cron[919]: sendmail: Cannot open smtp.gmail.com:587
Jan 02 16:54:40 alien CRON[950]: pam_unix(cron:session): session closed for user root

Một điều cần lưu ý là cron có thể gửi email cho bạn tình trạng của công việc và @reboot công việc chạy quá sớm quản lý mạng và email sẽ không chạy trừ khi bạn đặt sleep lệnh vào (các) tập lệnh của bạn.

Đặt kịch bản của bạn ở đâu

Đặt tập lệnh của bạn vào thư mục /etc/cron.d:

$ ll /etc/cron.d
total 44
drwxr-xr-x   2 root root  4096 Nov 26 19:53 ./
drwxr-xr-x 139 root root 12288 Dec 31 13:58 ../
-rw-r--r--   1 root root   244 Dec 28  2014 anacron
-rw-r--r--   1 root root   148 Feb 18  2017 cycle-grub-background
-rw-r--r--   1 root root   138 Mar  5  2017 display-auto-brightness
-rw-r--r--   1 root root   460 Nov 26 19:53 nvidia-hdmi-sound
-rw-r--r--   1 root root   102 Feb  9  2013 .placeholder
-rw-r--r--   1 root root   224 Nov 19  2016 touch-vmlinuz
-rw-r--r--   1 root root   700 Aug  5 11:15 turn-off-hyper-threading

Kịch bản trông như thế nào?

Dưới đây là một vài kịch bản mà tôi đã thiết lập để chạy mỗi lần khởi động:

$ cat /etc/cron.d/cycle-grub-background SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin 
@reboot   root    /usr/local/bin/cron-reboot-cycle-grub-background

$ cat /etc/cron.d/touch-vmlinuz
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
@reboot   root    touch "/boot/vmlinuz-"`uname -r`

3
2018-01-03 01:02



Có nhiều cách khác nhau để thêm cronjob, nhưng cốt lõi của câu trả lời được bình chọn rất cao và câu trả lời của bạn vẫn là @reboot. - muru
Các phương pháp thay thế để thêm crontabs sẽ được đăng lên askubuntu.com/q/2368/158442, đó là rõ ràng về việc thêm các công việc Cron. - muru
Tôi có ý kiến ​​khác. Cốt lõi của câu trả lời được đề cập sử dụng crontab -e mà một số xem xét một trong những nghệ thuật đen do một giao diện giống như vim. Mặt khác, câu trả lời này có thể thu hút những người có bộ não có dây theo một cách nhất định. Chúng tôi không phải là tất cả các diễn viên từ cùng một khuôn. Sau đó, một lần nữa câu trả lời này đã có một phiếu bầu xuống vì vậy chúng tôi sẽ để cho nền dân chủ tham gia khóa học của cô ấy. - WinEunuuchs2Unix
Oh, làm ơn. Cả bạn và tôi đều biết rằng người chỉnh sửa có thể thay đổi. - muru
@muru Có lẽ vì bạn đã dạy tôi và tôi đã học cách thay đổi trình soạn thảo thành một cái gì đó như nano hoặc một vài CLI khác. Nhưng tôi đang ở trong trại gedit. ngoài ra crontab -e mang lại những ký ức về dấu hoa thị ("*") cho phút, giờ, v.v ... mà tôi luôn tìm thấy tôi cần hướng dẫn google. Tôi vẫn thấy sử dụng /etc/cron.d và /etc/cron.daily tôi đi đến lựa chọn. Đặc biệt vì nó phản chiếu /etc/udev/rules.d và /etc/systemd/system-sleep phương pháp. Nó chỉ có vẻ như là một phù hợp tốt đẹp. - WinEunuuchs2Unix