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?
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.
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).
Một cách tiếp cận là thêm một tác vụ @reboot cron :
crontab -e
sẽ cho phép bạn chỉnh sửa cron của mình.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.
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
Có nhiều cách khác nhau để tự động chạy lệnh:
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 init
và man 8 init
cung cấp cho bạn chi tiết đầy đủ.
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.
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).
Để chạy một (thời gian ngắn)1 lệnh khi khởi động bằng cách sử dụng systemd
NAME _ , bạn có thể sử dụng đơn vị systemd loại OneShot
name__. 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 ExecStart
name__:
[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
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.
$HOME/.config/autostart
.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!
Đố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
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.)
cron
được triển khai khác với bình chọn hàng đầuCâ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.
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.
Đặ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
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`