Có rất nhiều lý do khiến bạn muốn chạy script Python, ứng dụng hoặc loại script khác (ví dụ: script Bash) mỗi khi Raspberry Pi boot. Chẳng hạn như bạn có một robot hoặc thiết bị IoT phải sẵn sàng thực hiện một nhiệm vụ ngay khi Raspberry Pi khởi động. Hoặc có thể bạn chỉ muốn có một chương trình cụ thể chạy trong nền mọi lúc và không muốn khởi chạy thủ công vào mỗi phiên.
Có một số cách để tự động khởi động script khi boot Raspberry Pi, nhưng cách dễ nhất là sử dụng crontab, một tính năng lập lịch cũng cho phép bạn đặt script chạy vào những thời điểm cụ thể.
Crontab là gì?
Cron
Cron là một service, tự động khởi động mỗi lần boot Raspberry Pi, cho phép người dùng thực thi các lệnh theo lịch trình. Mỗi phút, cron sẽ quan sát xem nó có phải làm gì không và thực hiện điều đó.
Những gì bạn sẽ thấy trong bài viết hôm nay là cách yêu cầu cron thực thi lệnh hoặc script khi cần
Crontab
Crontab là một công cụ cho phép bạn liệt kê những gì mình muốn bắt đầu, ở một định dạng mà service cron có thể hiểu được. Một crontab sẽ chứa hai thứ:
- Danh sách các lệnh để chạy
- Thời điểm chạy chúng
Crontab cũng là một lệnh. Đây là cú pháp của lệnh crontab:
crontab [-u user] file
crontab [-u user] [-l | -r | -e] [-i] [-s]
Những điều bạn cần biết :
- u: Crontab đang mở crontab của người dùng hiện tại theo mặc định, nhưng bạn có thể chỉ định cái nào sẽ mở (nếu bạn có đủ quyền)
- l: Liệt kê nội dung crontab hiện tại
- e: Chỉnh sửa nội dung crontab hiện tại
- r: Xóa nội dung crontab hiện tại
Trong hầu hết mọi trường hợp, bạn sẽ chỉ sử dụng các lệnh “crontab -l” hoặc “crontab -e”.
Mẹo dùng crontab
Đặc quyền của người dùng
Một sai lầm phổ biến trong việc tạo cron là quên xem xét các đặc quyền của người dùng sẽ bắt đầu cron
Ví dụ, cron này trong người dùng mặc định của Raspberry (“pi”) sẽ không hoạt động:
@reboot /usr/sbin/service ssh start
Bạn sẽ gặp lỗi như sau:
Failed to start ssh.service: Interactive authentication required.
(Không khởi động được ssh.service: Yêu cầu xác thực tương tác).
Nếu bạn sử dụng crontab của người dùng hiện tại, cron sẽ chạy với các đặc quyền hiện có.
Pi không được phép bắt đầu một service, vì vậy nó không thể hoạt động. Để điều này hoạt động, bạn phải thêm dòng này trong crontab root (sudo crontab -e) hoặc crontab chung được tìm thấy trong /etc/crontab.
Đường dẫn tuyệt đối
Một sai lầm phổ biến khác khi sử dụng cron là bỏ qua đường dẫn file. Bạn phải sử dụng đường dẫn đầy đủ để làm cho nó hoạt động bình thường
Cron này sẽ không hoạt động, ngay cả trong crontab root:
@reboot service ssh start
Nếu bạn không chỉ định đường dẫn tuyệt đối, cron sẽ không biết file service ở đâu. Vì vậy, bạn phải viết /usr/sbin/service để làm cho cron này hoạt động.
Bạn cũng cần chú ý đến nội dung của các script. Ví dụ, nếu bạn có một script PHP bao gồm một file khác (ví dụ, bao gồm “file.php”) và bạn thêm script này vào crontab, nó sẽ không hoạt động
Bạn sẽ cần phải thêm đường dẫn tuyệt đối trong hàm bao gồm hoặc làm điều gì đó như sau:
@reboot cd /var/www/html; /usr/bin/php test.php
Bằng cách này, việc bao gồm sẽ được thực hiện trong /var/www/html và script PHP sẽ tìm thấy file “file.php”.
Cách chạy script khi Raspberry Pi boot
1. Chỉnh sửa danh sách crontab bằng cách gõ:
sudo crontab -e
Bạn có thể khởi chạy crontab mà không cần nhập sudo, nhưng nếu làm như vậy, bạn sẽ không thể chạy các script yêu cầu quyền admin. Trên thực tế, bạn nhận được một danh sách các crontab khác nếu bạn không sử dụng sudo, vì vậy đừng quên sử dụng nó.
2. Chọn nano nếu bạn được hỏi về trình soạn thảo.
Một file sẽ mở ra.
3. Thêm một dòng ở cuối file có nội dung như sau:
@reboot python3 /home/pi/myscript.py
Dòng này phải bắt đầu bằng @reboot, nó sẽ chạy nó mỗi khi bạn boot Raspberry Pi. Nếu nó là một script Python, bạn sẽ muốn đặt lệnh để khởi chạy trình thông dịch python hoặc python3, theo sau là đường dẫn đầy đủ đến script Python.
Nếu đó là script Bash hoặc ứng dụng khác, chỉ cần đặt đường dẫn đầy đủ đến nó.
4. Lưu và thoát. Trong Nano, bạn làm điều đó bằng cách nhấn CTRL
+X
, trả lời Y
và nhấn Enter
khi được nhắc.
5. Hãy làm cho script có thể thực thi được nếu nó là script Bash. Các script Python sẽ không cần phải thực thi được vì đã có trình thông dịch python. Bạn có thể làm cho bất kỳ script nào có thể thực thi được bằng cách gõ:
sudo chmod a+x FILENAME
Nếu bạn muốn xóa script của mình khỏi crontab, chỉ cần nhập lại sudo crontab -e
và xóa hoặc ghi chú dòng đó. Lưu ý rằng, nếu bạn đang xây dựng một dự án không yêu cầu sử dụng môi trường có cửa sổ, bạn có thể tiết kiệm tài nguyên hệ thống bằng cách cấu hình Raspberry Pi để boot vào dòng lệnh bằng cách nhập sudo raspi-config
và sau đó điều hướng đến Boot Options > Desktop / CLI và chọn Console Autologin.
Cách tự động chạy script hoặc ứng dụng trong GUI của Raspberry Pi
Nếu bạn muốn chạy script hoặc ứng dụng khi khởi động Raspberry Pi trong GUI, hãy làm theo các bước sau.
1. Tạo một file có tên myapp.desktop (hoặc một tên gì đó khác .desktop) trong thư mục /etc/xdg/autostart/.
sudo nano /etc/xdg/autostart/myapp.desktop
2. Sử dụng bố cục sau trong file myapp.desktop.
[Desktop Entry] Exec=chromium-browser https://www.tomshardware.com
Đặt lệnh và bất kỳ tham số nào trên dòng Exec=. Ví dụ, để trình duyệt Chrome mở ra một trang web, bạn cần nhập “chromium-browser [URL]”. Nếu ứng dụng yêu cầu quyền sudo, bạn có thể đặt sudo trong lệnh Exec.
Để chạy script trong cửa sổ Terminal, hãy sử dụng lxterminal theo sau là tham số --command và dấu ngoặc kép với “/bin/bash -c ‘MYCOMMANDS HERE; /bin/bash”’. Ví dụ, để khởi chạy một script python3 yêu cầu quyền sudo, bạn cần sử dụng:
Exec=lxterminal --command”/bin/bash -c ‘sudo python3 /home/pi/myscript.py; /bin/bash’”
Điều đó sẽ khởi chạy một cửa sổ Terminal trong môi trường có cửa sổ khi boot với script chạy trong đó. Khi script kết thúc (hoặc bạn hủy bỏ nó bằng cách nhấn CTRL
+C
), cửa sổ Terminal sẽ trở về dấu nhắc. Nếu muốn cửa sổ Terminal tự đóng sau khi hoàn thành script, bạn có thể bỏ qua ;/bin/bash ở cuối.
Chạy một script trong cửa sổ Terminal như thế này có thể hữu ích, bởi vì nếu nó có một script Python với vòng lặp vô tận (chẳng hạn như bạn có một con robot), bạn có thể dễ dàng kết thúc (kill) script bằng cách nhấn CTRL
+C
. Mặt khác, để kết thúc script, bạn phải tìm tiến trình được mô tả bên dưới.
Kết thúc script
Điều gì sẽ xảy ra nếu bạn muốn dừng script tự động chạy sau khi Raspberry Pi đã khởi động? Nếu script đã chạy xong, nó sẽ biến mất khỏi bộ nhớ, nhưng nếu nó được thiết kế để làm một điều gì đó liên tục, bạn sẽ cần phải tìm kiếm và kết thúc tác vụ.
1. Tìm kiếm script bằng cách sử dụng lệnh ps aux
và đặt tên script (hoặc ít nhất là một phần tên) sau grep.
ps aux | grep app.py
Thay thế app.py bằng tên script của bạn. Bạn sẽ thấy một danh sách các số tiến trình.
2. Kết thúc từng số tiến trình bằng lệnh sudo kill -9
. Ví dụ:
sudo kill -9 437 sudo kill -9 438