it-swarm-vi.com

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

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

497
myusuf3

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 khởi động . 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.

Ở 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 tin . 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 tệp này trong tệp .conf trong /etc/init (nếu bạn cần nó để chạy bằng root khi hệ thống khởi động) hoặc trong ~/.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).

200
LassePoulsen

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

  1. Chạy crontab -e sẽ cho phép bạn chỉnh sửa cron của mình.
  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.

531
ceejayoz

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 để chỉnh sửa tệp này.

Sudo nano /etc/rc.local
154
paolo granada lim

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

  1. Hệ thống pstart sẽ thực thi tất cả các tập lệnh mà nó tìm thấy 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 ứ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 man man 5 initman 8 init cung cấp cho bạn chi tiết đầy đủ.

  2. Tập lệnh Shell có tên .gnomerc trong thư mục chính của bạn sẽ tự động được lấy 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 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 tập lệnh .gnomerc 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 thêm & vào lệnh gọi chương trình, để tách nó khỏi Shell đ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 loại bỏ 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 tập lệnh .gnomerc, ngoại trừ bạn không cần biết cú pháp sh (nhưng bạn không thể sử dụng bất kỳ cấu trúc lập trình sh nào).

70
Riccardo Murri

Cho 15.04 trở lên:

Để chạy một (thời gian ngắn)1 lệnh khi khởi động bằng cách sử dụng systemdNAME _ , bạn có thể sử dụng đơn vị systemd loại OneShotname__. 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 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 dòng ExecStartname__:

[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. Một - trước đường dẫn báo cho 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, thay vào đó, bạn có thể tạo đơn vị systemd trong ~/.config/systemd. Đ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 kiểm soát bằng các lệnh tương tự như với các dịch vụ hệ thống, nhưng với tùy chọn --user đượ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 lệnh Exec* 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 ;), nhưng đó là về cú pháp giống như Shell. Đối với bất kỳ đ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 '...'.


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

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

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

Đặt tệp .desktop sau vào $HOME/.config/autostart và được cung cấp 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 của bạn
[.__.] (thường được đề xuất cho /usr/local/bin vì vậy - có thể được thực thi bằng lệnh trực tiếp nói myscript được thay thế bằng "</path/to/script>").

Ví dụ mẫu của script.sh:

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

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

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

27
Pandya

Đố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 tạo một khởi động công việc nếu đó là một mức độ thấp hơn đồ đạc.

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

18
tutuca

Bạn nên sử dụng khởi động 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.)

5
txwikinger

Câu trả lời cron được triển khai 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 đượ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 cron chạ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à cron có 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 công việc @reboot chạy nên trình quản lý mạng và email sớm sẽ không chạy trừ khi bạn đặt lệnh sleep vào tập lệnh của bạn.

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 số 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`
3
WinEunuuchs2Unix