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?
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?
Câu trả lời:
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.
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 .conf
tệ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).
system->pref->startup applications
khô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?
Một cách tiếp cận là thêm một tác vụ cron @reboot :
crontab -e
sẽ cho phép bạn chỉnh sửa cron của bạn.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.
@reboot
từ khóa là một mẹo tốt đẹp bởi vì nó không được biết đến rộng rãi.
man 5 crontab
nói rằng @reboot
được thực thi khi khởi động (khi cron daemon được khởi động).
rc.local
kể 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 ..
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
chmod 755 rc.local
và thêm #!/bin/bash
vào dòng đầu tiê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.service
có 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 ExecStart
dò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/systemd
thay 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 --user
tùy chọn đượ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 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.
WantedBy
sử 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
RemainAfterExit
phụ 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
.
df
nhu 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
.
Có nhiều cách khác nhau để tự động chạy lệnh:
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 init
và man 8 init
cung cấp cho bạn thông tin đầy đủ.
Một tập lệnh shell có tên .gnomerc
trong 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 .gnomerc
tậ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.
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 .gnomerc
tập lệnh, ngoại trừ bạn không cần biết sh
cú pháp (nhưng bạn không thể sử dụng bất kỳ sh
cấu trúc lập trình nào ).
.gnomerc
chạy rõ ràng trước khi tải Unity và Startup Applications
dườ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!
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.
$HOME/.config/autostart
.desktop
tập tin có thể được đặt ở đây sẽ được thực hiện khi khởi động.Ví dụ mẫu cho .desktop
tệp:
Đưa .desktop
tập tin sau vào $HOME/.config/autostart
và đư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/bin
có thể được thực thi bằng lệnh trực tiếp nói 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 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!
Đố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
cron
câu trả lời được thực hiện 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 @reboot
cô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 sleep
lệnh vào (các) tập lệnh của mình.
Đặ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 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`
@reboot
.
crontab -e
mà 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.
crontab -e
mang đế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
và /etc/cron.daily
lựa chọn của tôi. Đặc biệt là vì nó phản chiếu /etc/udev/rules.d
và /etc/systemd/system-sleep
phương pháp. Nó chỉ có vẻ là một phù hợp tốt đẹp.
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.)