Thực thi kịch bản khi khởi động


189

Tôi đang cố gắng thực thi một kịch bản khi Raspberry Pi của tôi khởi động. Tôi muốn trình duyệt web tự động mở ra.

Tôi đã cố gắng tìm một giải pháp đơn giản, (như bỏ tập lệnh của tôi vào thư mục "khởi động" hoặc một cái gì đó tương tự) nhưng tôi không thấy bất cứ điều gì như vậy.

Tôi đã xem xét Upstart , nhưng tôi đang cố gắng nắm bắt cách thức hoạt động của nó. Bất kỳ tập lệnh nào tôi đã thử đều không hoạt động khi tôi kiểm tra chúng.


4
Bạn đang chạy hệ điều hành nào? Trong FreeBSD, mà tôi đang sử dụng trên Pi của mình, bạn có thể thêm tập lệnh khởi động vào /usr/local/etc/rc.d/ hoặc chỉ cần thêm mọi thứ vào /etc/rc.local. Các bản phân phối Linux khác nhau có các phương pháp được đề xuất khác nhau. Nếu bạn đang chạy X trên nó, thì bạn có thể xem xét thêm mọi thứ vào tệp .xinitrchoặc .xsessiontệp của mình.
ghoti

Thông tin thêm về quá trình khởi động X có thể được tìm thấy ở đây .
ghoti

6
Xin lưu ý câu trả lời được chấp nhận ở đây có một số cảnh báo và về mặt kỹ thuật không bắt đầu bất cứ điều gì khi khởi động ngoại trừ trong các điều kiện cụ thể. Đọc nó cẩn thận.
goldilocks

Bạn đang yêu cầu một kịch bản chạy khi bạn đăng nhập, không phải khi pi khởi động hoặc khi khởi động. Hai điều rất khác nhau, và tiêu đề đang làm sai lệch kết quả tìm kiếm của google.
IAmNaN

Câu trả lời:


197

Để chạy Midori khi khởi động, hãy xem hướng dẫn này . Đối với các giải pháp DIY, đọc tiếp.


Bạn có thể thêm lệnh thực thi tập lệnh của mình vào cuối lệnh .bashrcsẽ chạy tập lệnh của bạn mỗi lần mở một thiết bị đầu cuối (hoặc chạy một phiên bản mới của bash) .

  1. Hãy chắc chắn rằng bạn đang ở trong pithư mục:

    $ cd ~
    
  2. Tạo một tệp và viết một tập lệnh để chạy trong tệp:

    $ sudo nano superscript
    
  3. Lưu và thoát: Ctrl+ X, Y,Enter

  4. Mở ra .bashrcđể cấu hình:

.bashrcKHÔNG có ý định để chạy script.

Nó được chạy mỗi khi một vỏ tương tác không đăng nhập được khởi động và được sử dụng để cấu hình shell.
~/.bashrc: executed by bash(1) for non-login shells.

   $ sudo nano .bashrc
  1. Cuộn xuống phía dưới và thêm dòng: ./superscript

  2. Lưu và thoát: Ctrl+ X, Y,Enter


Nếu bạn đang tìm kiếm một giải pháp hoạt động khi khởi động lên bàn điều khiển , hãy xem liên kết này . Danh sách cơ bản:

  1. Tạo một tệp cho tập lệnh khởi động của bạn và viết tập lệnh của bạn vào tệp:

    $ sudo nano /etc/init.d/superscript
    
  2. Lưu và thoát: Ctrl+ X, Y,Enter

  3. Làm cho tập lệnh thực thi:

    $ sudo chmod 755 /etc/init.d/superscript
    
  4. Đăng ký tập lệnh để được chạy khi khởi động:

    $ sudo update-rc.d superscript defaults
    

Nếu bạn muốn tập lệnh chạy khi bạn khởi động vào môi trường LXDE , bạn có thể xem bài đăng trên diễn đàn Raspberry Pi này :

  1. Hướng đến ~/.config/lxsession/LXDE-pi

  2. Mở autostarttệp trong thư mục đó:

    $ sudo nano autostart
    
  3. Thêm @midorivào một dòng mới. Nếu bạn muốn chạy một cái gì đó như một kịch bản python, hãy đặt một cái gì đó như @python mypython.pytrên một dòng mới. Chạy một tập lệnh sẽ là @./superscript, nhưng vì một số lý do, tập lệnh chạy trong một vòng lặp vô hạn (có lẽ điều này sẽ ngăn chặn điều đó).

  4. Lưu và thoát: Ctrl+ X, Y,Enter

  5. Khởi động lại Raspberry Pi của bạn vào môi trường LXDE.


Hướng dẫn thiết lập Midori khi khởi động chỉ là những gì tôi đang tìm kiếm. Không chắc tại sao có nhiều cách để làm một việc đơn giản như vậy, nhưng tôi rất vui vì giờ nó đã hoạt động.
Tyler Murry

1
@ syb0rg Việc chạy tại phần đăng nhập hoạt động như một bùa mê (+1) nếu tôi đăng nhập qua ssh, nhưng không phải khi phiên máy tính để bàn lxde bắt đầu. Có cách nào làm được việc này không ?
George Profenza

@GeorgeProfenza Khi bạn làm gì $ sudo startx?
syb0rg

2
Chỉ muốn chỉ ra rằng tập lệnh pyhton sẽ chạy, nhưng nếu có bất kỳ lỗi nào, nó sẽ chỉ ở đâu đó trong nền bằng cách sử dụng phương thức / etc / xdg / lxsession / LXDE / autostart. sử dụng .barshrc cũng sẽ tiết lộ lỗi, nhưng điều thực sự quan trọng là phải đảm bảo kịch bản chặt chẽ ngay từ đầu (phát hiện ra điều đó một cách khó khăn :))
George Profenza

7
.bashrckhông được đọc khi hệ thống khởi động hoặc khi người dùng đăng nhập , chỉ khi mở một thiết bị đầu cuối mới (và nó được đọc mỗi khi người dùng mở một thiết bị đầu cuối mới). Tôi bối rối rằng câu trả lời này có rất nhiều ý kiến ​​trái chiều : phần đầu tiên hoàn toàn sai . Phần thứ ba là chính xác để thực hiện một chương trình GUI.
Gilles

46

Cách mà tôi đã thấy hầu hết mọi người làm điều đó (hãy xem trên các diễn đàn Raspberry Pi) và đã tự mình thực hiện với thành công là sử dụng /etc/rc.local.

Tất cả bạn cần làm ở đây là đặt ./myscripttrong tệp văn bản RC.local. Nếu nó ở trăn, hãy đặt python myscript.py.

Đây thực sự là "một giải pháp đơn giản, (như bỏ tập lệnh của tôi vào thư mục" khởi động "hoặc một cái gì đó tương tự)" - có thể tìm kiếm trên các diễn đàn khi bạn có câu hỏi, giải pháp này đã đưa ra 4 kết quả đầu tiên của một tìm kiếm trên google!


4
FYI RC.local theo mặc định có nhiều nhận xét khác nhau về tập lệnh không làm gì và cần thay đổi các bit thực thi. Điều này không đúng, chỉ cần nhập lệnh cho tập lệnh của bạn trước khi thoát 0 và nó sẽ chạy khi khởi động. Hãy chắc chắn rằng tập lệnh của bạn thoát khỏi các lần chạy trong nền hoặc nó sẽ chặn lời nhắc đăng nhập. Vâng, đó là những gì tôi đã làm.
cướp


@rob Bạn có nghĩa là họ đề nghị tập lệnh được đặt thành thực thi? Điều này được giảm nhẹ trong câu hỏi bằng cách chạy tập lệnh bằng lệnh python myscript.py. Nếu bạn muốn chmod + x nó và thêm #! /bin/python, bạn có thể chạy các kịch bản bằng cách làm $pathtofile/myscript.pynơi $pathtofile.nếu bạn đang ở trong cùng một thư mục hoặc đường dẫn tuyệt đối hoặc tương đối so với tập tin.
JFA

1
Điều đó không tốt cho chương trình GUI như trình duyệt. /etc/rc.localchỉ để bắt đầu các dịch vụ hệ thống (các chương trình không có giao diện người dùng).
Gilles

1
@ ErickM.Sprengel Sử dụng một trong những câu trả lời đúng trên chủ đề này, chẳng hạn như câu hỏi này .
Gilles

32

Thêm nó vào crontab

Crontab chạy các lệnh tại thời điểm xác định.


Chỉnh sửa tập tin:

sudo crontab -e

Thêm dòng vào tệp (ở đây là tập lệnh python):

@reboot python3 /home/pi/Desktop/exemple.py &

2
Để có một chút khó chịu ở đây, về mặt kỹ thuật, nó không phải là crontab chạy lệnh, mà là dù sao đi nữa. Liên quan đến dòng được liệt kê để thêm, nên đặt đường dẫn đầy đủ cho các lệnh được xác định ở đây (trong trường hợp này là đường dẫn đầy đủ đến python3), xem tại đây
Ghanima

Đây là phương pháp tôi luôn sử dụng do tính đơn giản của nó. +1
Patrick Cook

Điều đó không tốt cho chương trình GUI như trình duyệt. /etc/rc.localchỉ để bắt đầu các chương trình không có giao diện người dùng.
Gilles

2
Sau khi dành nhiều thời gian để cố gắng làm cho nó hoạt động với RC.local và init.d và tất cả các loại công cụ khác .. điều này đã hoạt động ngay lập tức! Cảm ơn phân bổ!
Piotr Kula

4
điều này không hoạt động vì một số lý do trong rpi os
Denis

11

Tự động khởi động ứng dụng xorg

Nếu tập lệnh bạn muốn bắt đầu yêu cầu phiên xorg thì bạn có thể thử làm theo thông số tự động khởi động freedesktop có thể hoạt động hoặc có thể không hoạt động tùy thuộc vào môi trường máy tính để bàn bạn đang sử dụng.

Ngoài ra, bạn có thể nhắm mục tiêu môi trường máy tính để bàn cụ thể của mình như được mô tả tại https://wiki.archlinux.org/index.php/autostarting .

Chạy một kịch bản như một dịch vụ systemd

Nếu tập lệnh của bạn phù hợp với mô tả của trình nền hoặc 'dịch vụ' và hệ thống của bạn đang chạy systemd , đó là trường hợp cho các dòng chữ raspbian và hiện đại nhất, thì bạn có thể định cấu hình tập lệnh của mình để chạy như một dịch vụ systemd - điều này cung cấp khả năng kiểm soát chi tiết môi trường vòng đời và thực thi, cũng như các điều kiện tiên quyết để (bắt đầu lại) tập lệnh, chẳng hạn như mạng đang hoạt động. Cũng có thể định cấu hình khởi động lại dịch vụ trong trường hợp thất bại ( Restart=alwaysvà trì hoãn giữa các lần khởi động lại, vd RestartSec=10).

Để sử dụng trên toàn hệ thống, hãy tạo tệp đơn vị systemd của bạn bên dưới /etc/systemd/system, ví dụ vim /etc/systemd/system/autossh.service:

[Unit]
Description=Autossh keepalive daemon
## make sure we only start the service after network is up
Wants=network-online.target
After=network.target

[Service]
## use 'Type=forking' if the service backgrounds itself
## other values are Type=simple (default) and Type=oneshot
Type=forking
## here we can set custom environment variables
Environment=AUTOSSH_GATETIME=0
Environment=AUTOSSH_PORT=0
ExecStart=/usr/local/bin/ssh-keep-alive.sh
ExecStop=/usr/bin/killall -9 autossh
### NOTE: you can have multiple `ExecStop` lines
ExecStop=/usr/bin/killall ssh
# don't use 'nobody' if your script needs to access user files
# (if User is not set the service will run as root)
#User=nobody

# Useful during debugging; remove it once the service is working
StandardOutput=console

[Install]
WantedBy=multi-user.target

Xem thêm:

Bây giờ chúng tôi đã sẵn sàng để thử nghiệm dịch vụ:

systemctl start autossh

Kiểm tra trạng thái của dịch vụ:

systemctl status autossh

Dừng dịch vụ:

systemctl stop autossh

Khi bạn xác minh rằng dịch vụ hoạt động như mong đợi, hãy kích hoạt nó với:

systemctl enable autossh

LƯU Ý: Vì mục đích bảo mật systemdsẽ chạy tập lệnh trong môi trường bị hạn chế, tương tự như cách crontabtập lệnh được chạy, do đó, không đưa ra bất kỳ giả định nào về các biến hệ thống tồn tại trước đó. Sử dụng các Environmentkhóa nếu tập lệnh của bạn cần các biến cụ thể được xác định. Thêm set -xvào đầu tập lệnh bash của bạn và sau đó chạy systemctl status my_servicecó thể giúp xác định lý do tại sao tập lệnh của bạn bị lỗi. Như một quy tắc của sự tê liệt, luôn luôn sử dụng các đường dẫn tuyệt đối cho mọi thứ bao gồm echocat, hoặc xác định rõ ràng $ PATH của bạn.


7

Tôi muốn ném vào hai xu của mình, mặc dù đây là một câu hỏi cũ nhưng thường được yêu cầu làm điều đơn giản - tự động khởi động. Tôi đã thử tất cả các giải pháp được đề xuất trong tất cả các câu trả lời cho câu hỏi này. Không ai trong số họ làm việc cho tôi. Tôi đang sử dụng Raspberry PI Model 2 với Raspbian.

Cách duy nhất tôi có thể khiến ứng dụng của mình tự khởi động thành công là thông qua một tập lệnh như sau. Tôi nói thành công vì ứng dụng của tôi bắt đầu như mong đợi mà không gặp vấn đề gì như bắt đầu với con đường làm việc sai.

1. Tạo một tệp trống có đuôi .sh và đặt tên cho bất cứ thứ gì bạn muốn.

2. Sao chép và Dán chính xác sau đây ngoại trừ thay đổi "tên ứng dụng của bạn" thành tên tập lệnh mà bạn vừa tạo.

 #! /bin/sh

 ### BEGIN INIT INFO
 # Provides:          noip
 # Required-Start:    $remote_fs $syslog
 # Required-Stop:     $remote_fs $syslog
 # Default-Start:     2 3 4 5
 # Default-Stop:      0 1 6
 # Short-Description: Simple script to start a program at boot
 ### END INIT INFO

 #change /direct/path/to/your/application to the path your application is in.
 cd /direct/path/to/your/application      # example cd /home/pi/myprogram/

 #change YourProgramExactName to Exact name of your program that you want to auto start
 ./YourProgramExactName

 exit 0 
  1. Sau đó, lưu tệp tập lệnh trong thư mục ứng dụng của bạn

  2. Sau đó, mở /home/pi/.config/autostartthư mục. Nó có thể khác trong trường hợp của bạn. Chỉ cần mở thư mục nhà của bạn và cho phép xem các thư mục ẩn. mở .config/autostart. Nếu bạn không thấy thư mục tự khởi động, thì hãy tạo thư mục có tên là tự khởi động trong thư mục .config.

  3. trong thư mục tự khởi động, bạn sẽ cần tạo một lối tắt đến tệp tập lệnh mà bạn đã tạo như sau. Tạo một tập tin trống với phần mở rộng .desktop.

  4. Sao chép và dán sau đây trong tập tin máy tính để bàn trống ngoại trừ bạn sẽ cần phải thay đổi Comment, Name, Exec, PathIcongiá trị trường của.

    [Desktop Entry]
    Comment=
    Exec=/path/to/Your/application/Name-of-the-script-file (.sh)
    Icon=/Path/to/Your/application/Icon/IconName
    Name=YourApplicationEXACTNAME
    Path=/Path/to/Your/Application-ONLY
    Type=Application
    
  5. Lưu và đóng tệp sau khi thay đổi tất cả các trường cần thiết. Bạn xong việc rồi. Chỉ cần kiểm tra nó ra.


Về mặt kỹ thuật, tập lệnh này được điều hành bởi hệ thống chứ không phải bởi một người dùng cụ thể - vì vậy có lẽ ứng dụng của bạn tốt hơn thuộc về /usr/local/bin/ApplicationName...?
SlySven

@SlySven "hệ thống" là một người dùng cụ thể.
Chuộc tội có giới hạn

Nó chạy dưới dạng root (UID = 0) hay người dùng pi (UID ~ 500 hoặc 1000 IIRC) - nếu nó chạy dưới dạng root hoặc UID hệ thống khác (dưới 500) thì theo truyền thống, tốt nhất là lưu trữ tệp tập lệnh ( hoặc bất kỳ phụ thuộc vào) trên thiết bị gốc để có vấn đề với bất kỳ thiết bị nào khác (ví dụ: homenếu đó là một thiết bị riêng biệt) sẽ không có vấn đề với tập lệnh (hoặc tập tin thực thi) không khả dụng khi tệp hệ thống không trở lại /bin/shvỏ người dùng ! Ngày nay, systemdcách là gắn kết cả hai //usrtrước khi bắt đầu PID 1 ...
SlySven

5

Tôi cũng gặp rắc rối với điều này. Trên Raspberry Pi3 đang chạy Raspbian, đây là những gì tôi đã làm:

  1. Tạo một tập lệnh shell khởi động trong thư mục gốc của bạn (tôi đặt tên là "launch" của tôi):

khởi động sudo leafpad.sh

  1. Lưu các tập tin
  2. Chỉnh sửa tệp tự khởi động LXDE-pi

sudo leafpad /home/pi/.config/lxsession/LXDE-pi/autostart

  1. Thêm phần này vào dưới cùng của tập tin đó

./launch.sh

  1. khởi động lại

3

Trên Raspberry Pi3 đang chạy Raspbian Stretch, đây là những gì tôi đã làm:

Chỉnh sửa tệp tự khởi động LXDE-pi

    sudo nano /home/pi/.config/lxsession/LXDE-pi/autostart

Thêm phần này vào dưới cùng của tập tin đó

    @sudo python3 /path/to/your/script.py

lưu và khởi động lại


1

Cách 1:

Để tự động khởi chạy một lệnh khi đăng nhập, hãy đặt lệnh vào một tệp có tên

.bashrc

trong thư mục người dùng (ví dụ / home / pi)

.bashrcKHÔNG có ý định để chạy script.

Nó được chạy mỗi khi một vỏ tương tác không đăng nhập được khởi động và được sử dụng để cấu hình shell.
~/.bashrc: executed by bash(1) for non-login shells.

Ví dụ: tệp có thể chứa

chromium-browser --kiosk www.google.com

để khởi chạy Chromium ở chế độ toàn màn hình được trỏ tới www.google.com


Cách 2:

Giải pháp này hoạt động thực sự tốt. Khi trình duyệt tải, có một ô vuông nhỏ màu đen ở phía trên bên trái màn hình có vẻ là một lỗi chung (được đề cập trên các diễn đàn bởi những người khác) nhưng nếu không thì chế độ toàn màn hình sẽ ẩn mọi thứ trừ trang trình duyệt.

Chỉnh sửa tập tin tự động khởi động:

sudo nano /etc/xdg/lxsession/LXDE/autostart 

Nhận xét mọi thứ bằng cách sử dụng '#' ở đầu mỗi dòng và sau đó thêm các dòng sau

Tự động chạy trình duyệt

@xset s off
@xset -dpms
@xset s noblank
@midori -e Fullscreen -a http://google.com

Nếu cần, hãy sử dụng công cụ cấu hình để cho phép tự động chạy GUI khi bật nguồn

sudo raspi-config

Nếu bạn cần thoát trở lại dấu nhắc lệnh CTRL+ ALT+F1

CTRL+ ALT+F2


0

Bạn có thể đặt tập lệnh của bạn ở dưới cùng của /etc/profiletập tin.

Các tùy chọn khác không phù hợp với tôi, nhưng điều này có thể là do tôi đã đặt tập lệnh của mình lên màn hình nền.


0

tạo một tệp .sh bằng các lệnh 'python /path/to/your/script.py' gõ 'sudo nano /etc/rc.local' và nhập đường dẫn đến tệp .sh

trước

exit 0

Hoặc bạn chỉ có thể gõ

crontab -e

hoặc là

sudo crontab -e 

nếu bạn muốn tập lệnh chạy khi khởi động

bên trong loại tập tin trong

@reboot python /path/to/your/script.py &

2
Việc sử dụng các đường dẫn đầy đủ được khuyến khích mạnh mẽ cho các mục crontab!
Ghanima

-2

nó hoạt động . (Trên mỗi lần khởi động lại, nó tự động chuẩn bị các bài nộp sau)

$ cat /etc/rc.local
#!/bin/sh -e
echo "18" > /sys/class/gpio/export
echo "out" > /sys/class/gpio/gpio18/direction
echo "1" > /sys/class/gpio/gpio18/value
exit 0

-2

Đây là những gì tôi thường làm.

  1. Lưu trữ tập tin của bạn trong thư mục nhà raspberry pi. Ví dụ: mycode.py
  2. Chỉnh sửa tập tin:

    sudo nano .bashrc

.bashrcKHÔNG có ý định để chạy script.

Nó được chạy mỗi khi một vỏ tương tác không đăng nhập được khởi động và được sử dụng để cấu hình shell.
~/.bashrc: executed by bash(1) for non-login shells.

  1. Đi đến cuối tập tin và viết:

    sudo python mycode.py

  2. Nếu bạn muốn đầu ra được lưu trữ trong tệp txt, hãy chỉnh sửa mã trong Bước 3 như sau:

    sudo python mycode.py >> output.py

Hi vọng điêu nay co ich!

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.