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


520

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


3
Nếu ai đó cũng có thể hiển thị cả WHEN và WHERE thì thật tuyệt vời. 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

1
Toàn bộ chủ đề 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

1
Nó thực sự khá thú vị. Có bao nhiêu cách khác nhau có thể có?
devios1

Câu trả lời:


206

Tùy thuộc vào loại tập lệnh nào bạn cần chạy .. Đối với các dịch vụ và tương tự bạn nên sử dụng mới bắt đầu . Nhưng đối với tập lệnh người dùng, các tập lệnh này phải được khởi chạy dưới dạng tập lệnh phiên bởi gnome! Hãy xem Hệ thống> Tùy chọn> Ứng dụng Khởi động.

Trên một lưu ý phụ nếu bạn cần một số tập lệnh được chạy khi đăng nhập thiết bị đầu cuối, bạn có thể thêm chúng vào tệp .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 duy trì hoạt động) có thể sử dụng một công việc Upstart như:

start on startup
task
exec /path/to/command

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


58
Xem xét cách SO và StackExchange chạy, bạn có thể đưa ra một ví dụ về tập lệnh khởi động và vị trí của nó không? Điều đó sẽ làm cho điều này một câu trả lời 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à để xem cuốn sách 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

2
Nếu tôi cần chạy lệnh là root thì sao?
dopatraman

1
@dopatraman Câu trả lời nói rằng tất cả các quy trình với điều này được chạy dưới quyền root.
AStopher

4
Vui lòng cập nhật câu trả lời này để giải thích những việc cần làm trên các hệ thống chạy systemd thay vì mới bắt đầu (Ubuntu 15.04+).

3
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 applicationskhông thể được tìm thấy trong /etc/init/hoặc trong ~/.config/upstart. Vậy các ứng dụng khởi động được định nghĩa ở đâu?
Blauhirn

553

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

  1. Chạy crontab -esẽ 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.


85
Các @reboottừ khóa là một mẹo tốt đẹp bởi vì nó không được biết đến rộng rãi.
jathanism

12
Đẹp. Bất kỳ ý tưởng chính xác khi điều này kích hoạt?
Oli

2
Vậy ... điều này sẽ không chạy nếu tôi mất điện và PC quay lại khi nguồn được phục hồi?
Mike sẽ làm

18
@siamii: man 5 crontabnói rằng @rebootđược thực thi khi khởi động (khi cron daemon được khởi động).
jfs

9
Điều này thật tuyệt. Cho đến nay, điều này có vẻ tốt hơn rc.localkể từ khi hệ thống dường như được thiết lập nhiều hơn vào thời điểm này (PATH, v.v.). Thật kỳ lạ khi thật khó để gọi một cái gì đó sau khi khởi động hệ thống ..
Karthik T

161

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

sudo nano /etc/rc.local

19
Điều này trực tiếp nhất trả lời câu hỏi: làm thế nào để thực hiện một số tập lệnh 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 các tiến trình daemon.
Dogweather

1
Vì vậy, khởi động bắt đầu các tiến trình daemon trong khi /etc/rc.local bắt đầu các tập lệnh bash?
Donato

5
Có nên không? Điều này không còn hoạt động những ngày này, phải không?
DaVince

4
Doenst hoạt động với Ubuntu 17.04 systemd
qodeninja

3
Lưu ý rằng nếu bạn tự tạo tệp này (như tôi đã làm), thì bạn sẽ phải thay đổi tệp thành tệp thực thi chmod 755 rc.localvà thêm #!/bin/bashvào dòng đầu tiên.
psitae

77

Cho 15.04 trở lên:

Để chạy (ngắn ngủi) 1 lệnh lúc khởi động sử dụng systemd, bạn có thể sử dụng một đơn vị systemd loại OneShot. Ví dụ: tạo /etc/systemd/system/foo.servicecó 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 thành một systemd (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 ExecStartdòng:

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

Lệnh phải luôn luôn được đưa ra với đường dẫn đầy đủ. Nếu bất kỳ lệnh nào thất bại, phần còn lại sẽ không chạy. A -trước đường dẫn yêu cầu systemd bỏ qua trạng thái thoát khác không (thay vì coi đó là một thất bạ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 ~/.config/systemdthay thế. Điều này sẽ hoạt động với 16.04 trở đi, nhưng không phải là bản phát hành Ubuntu trước đó với systemd (vì những bản này vẫn được sử dụng Upstart cho các phiên của người dùng). Các đơn vị phiên người dùng có thể được điều khiển bằng các lệnh tương tự như với các dịch vụ hệ thống, nhưng với --usertùy chọn được thêm vào:

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

Cú pháp Shell

Lưu ý rằng, không giống như Upstart, systemd không chạy các Exec*lệnh thông qua shell. Nó thực hiện một số mở rộng biến giới hạn và nhiều lệnh (được phân tách bằng ;) chính nó, nhưng đó là về cú pháp giống như shell. Đối với bất cứ điều gì phức tạp hơn, hãy nói chuyển hướng hoặc đường ống, bọc lệnh của bạn trong sh -c '...'hoặc bash -c '...'.


1 Trái ngược với daemon sống lâu.


Có thể đặt ưu tiên cho công việc? hoặc xác định rằng nó phụ thuộc vào dịch vụ khác được bắt đầu trước?
r3wt

1
@ r3wt vâng, có nhiều cách khác nhau để làm điều đó. Việc WantedBysử dụng ở đây, ví dụ, làm cho nó bắt đầu khi multi-user.targetđạt được. Bạn có thể sử dụng Before, After, Requires, vv Xemman systemd.unit
muru

@PerlDuck không phải là điều duy nhất nó thiếu. Cảm ơn!
muru

Không có gì. - Btw, RemainAfterExitphụ thuộc vào dịch vụ bạn bắt đầu và hành vi mong muốn của nó. Chẳng hạn, /bin/df -h<s> would </ s> nên có RemainAfterExit=no.
PerlDuck

@PerlDuck Không có gì vốn có trong dfnhu cầu đó RemainAfterExit=no. Trừ khi bạn muốn liên tục thực hiện lệnh mỗi lần bạn chạy systemctl start foo.
muru

71

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

  1. Các mới nổi hệ thống sẽ thực hiện tất cả các kịch bản 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 để đáp ứng với các sự kiện nhất định, ví dụ: yêu cầu tắt máy) và đó 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ủ được 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.ubfox.com/getting-started.html các trang hướng dẫn man 5 initman 8 initcung cấp cho bạn thông tin đầy đủ.

  2. Một tập lệnh shell có tên .gnomerctrong thư mục chính của bạn sẽ tự động có nguồn gốc 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 nhìn thấy bởi bất kỳ chương trình nào 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 .gnomerctập lệnh kết thúc; do đó, nếu bạn muốn tự động khởi động một số chương trình chạy dài, bạn cần phải thêm &vào lệnh gọi chương trình, để tách nó ra 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 ứng dụng nào sẽ được khởi động khi phiên đồ họa của bạn bắt đầu (Ubuntu xác định trước một số) và thêm hoặc xóa chúng theo sở thích của bạn. Điều này có cùng mục đích và phạm vi của .gnomerctập lệnh, ngoại trừ bạn không cần biết shcú pháp (nhưng bạn không thể sử dụng bất kỳ shcấu trúc lập trình nào ).


11
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ừ .gnomercchạy rõ ràng trước khi tải Unity và Startup Applicationsdường như chạy sau khi 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 sự khác biệt lớn trong trường hợp này!
chàng người Brazil đó

1
@ ruda.almeida Cảm ơn bạn đã chỉ ra điều đó. Câu trả lời đã được viết trong những ngày trước khi thống nhất.
Riccardo Murri

1
sudo update-rc.d myscript.sh defaults, trong đó /etc/init.d/myscript.sh là tập lệnh của bạn, cũng chạy nó khi khởi động.
Dan Dascalescu

27
$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 hiện khi khởi động.

Ví dụ mẫu cho .desktoptệp:

Đưa .desktoptập tin sau vào $HOME/.config/autostartvà đưa ra 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 của bạn script.sh
(thường được đề xuất để /usr/local/bincó thể được thực thi bằng lệnh trực tiếp nói myscriptthay thế bằng "</path/to/script>").

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

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

Kết quả: .desktoptập tin sẽ được khởi chạy từ $HOME/.config/autostartđó thực thi tập lệnhExec=

Do đó, bạn có thể chạy tập lệnh shell mong muốn khi khởi động!


18

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

Ngoài ra, bạn có thể thêm nó vào /etc/init.d/rc.local hoặc thực hiện một công việc mới bắt đầu nếu đó là một công cụ cấp thấp hơn .

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


7

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 cronnhưng sử dụng một phương pháp khác với câu trả lời được bình chọn hàng đầu. Điều này hoạt động kể 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ừ ngày 16.04.

Khi nào cronchạy?

Trong các bình luận có người hỏi "khi nào họ chạy?". Bạn có thể nói trong syslog / tạp chí:

$ 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à croncó thể gửi email cho bạn trạng thái của các công việc đang chạy và các @rebootcông việc chạy để người quản lý mạng và email sớm sẽ không chạy trừ khi bạn đặt một sleeplệnh vào (các) tập lệnh của mình.

Nơi để đặt các kịch bản của bạn

Đặ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

Một kịch bản trông như thế nào?

Dưới đây là một vài tập lệnh 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`

1
Có nhiều cách khác nhau để thêm cronjobs, nhưng cốt lõi của câu trả lời được bình chọn 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 nên được đăng lên Askubfox.com/q/2368/158442 , đây là cách rõ ràng về việc thêm các công việc Cron.
muru

1
Tôi có ý kiến ​​khác. Cốt lõi của câu trả lời trong câu hỏi sử dụng crontab -emà một số người coi là một trong những nghệ thuật đen do 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 nối dây theo một cách nhất định. Chúng tôi không phải tất cả đúc 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 phép dân chủ tham gia khóa học của cô ấy.
WinEunuuchs2Unix

2
Ồ, làm ơn Bạn và tôi đều biết rằng trình soạn thảo có thể được thay đổi.
muru

@muru Có lẽ vì bạn đã dạy tôi và tôi đã học cách thay đổi trình chỉnh sửa thành thứ gì đó như nano hoặc một vài CLI khác. Nhưng tôi đang ở trong trại gedit. Bên cạnh đó crontab -emang đến những ký ức về dấu sao ("*") trong vài phút, vài giờ, v.v. mà tôi luôn thấy tôi cần phải hướng dẫn google. Tôi vẫn tìm thấy sử dụng /etc/cron.d/etc/cron.dailylựa chọn của tôi. Đặc biệt là vì nó phản chiếu /etc/udev/rules.d/etc/systemd/system-sleepphương pháp. Nó chỉ có vẻ là một phù hợp tốt đẹp.
WinEunuuchs2Unix

5

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

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.