Cách chạy shell shell khi khởi động


367

Trong một phiên bản Amazon S3 Linux, tôi có hai tập lệnh được gọi start_my_appstop_my_appbắt đầu và dừng mãi mãi (lần lượt chạy ứng dụng Node.js của tôi). Tôi sử dụng các tập lệnh này để tự khởi động và dừng ứng dụng Node.js của mình. Càng xa càng tốt.

Vấn đề của tôi: Tôi cũng muốn thiết lập nó để start_my_appchạy bất cứ khi nào hệ thống khởi động. Tôi biết rằng tôi cần thêm một tệp bên trong init.dvà tôi biết làm thế nào để liên kết nó với thư mục thích hợp bên trong rc.d, nhưng tôi không thể tìm ra những gì thực sự cần phải đi vào trong tệp mà tôi đặt init.d. Tôi nghĩ rằng nó chỉ là một dòng, như start_my_app, nhưng nó đã không làm việc cho tôi.


5
Tôi không có kinh nghiệm trong loại công cụ này, nhưng tôi nghĩ init.dgiải pháp ( ở đây ) nên được ưu tiên hơn cho rc.localgiải pháp bởi vì công cụ sau là công cụ cũ vẫn chỉ sử dụng được vì công cụ mới tương thích ngược.
erikbwork

pm2 bắt đầu my_app; khởi động pm2; pm2 lưu github.com/Unitech/pm2
Unitech

Câu trả lời:


292

Trong tệp bạn đặt, /etc/init.d/bạn phải đặt tệp thực thi với:

chmod +x /etc/init.d/start_my_app

Nhờ @meetamit, nếu điều này không chạy, bạn phải tạo một liên kết tượng trưng đến /etc/rc.d/

ln -s /etc/init.d/start_my_app /etc/rc.d/

Xin lưu ý rằng trên Debian mới nhất, điều này sẽ không hoạt động vì tập lệnh của bạn phải tuân thủ LSB (cung cấp, ít nhất là các hành động sau: bắt đầu, dừng, khởi động lại, buộc tải lại và trạng thái): https: //wiki.debian .org / LSBInitScripts

Lưu ý, bạn nên đặt đường dẫn tuyệt đối của tập lệnh thay vì tương đối, nó có thể giải quyết các vấn đề không mong muốn:

/var/myscripts/start_my_app

Và đừng quên thêm vào đầu tập tin đó:

#!/bin/sh

6
tôi đã làm điều này và nó đã không chạy. nó sẽ tự động chạy chỉ vì nó ở trong /etc/init.d hay tôi cần phải làm gì đó trên đầu để lên lịch chạy khi hệ thống khởi động?
lưỡng cư

4
@amphibient Chưa đủ ... Bạn cũng cần tạo một liên kết tượng trưng cho tệp này (sử dụng lnlệnh) đến một thư mục trongrc.d
meetamit

23
không có thư mục RC.d trong thư mục gốc của tôi .. điều này làm tôi chết lặng không phải đây là thư mục quan trọng mà Linux cần để khởi động? Nó chỉ thiếu một hệ điều hành của tôi dường như chạy tốt. Tôi có phải tạo ra nó không? Tôi thấy một loạt các tệp có tên tương tự như "rc1.d" cho đến "rc5.d"
OKGimmeMoney

3
Tôi không có bất kỳ /etc/rc.dthư mục nào , nhưng tôi có /etc/rcX.dcác thư mục (Ie /etc/rc0.d , /etc/rc1.d , /etc/rcS.d ), cũng có tệp /etc/rc.local . Tôi nghĩ rằng bạn nên tạo liên kết tượng trưng trong thư mục tùy chỉnh như /etc/rc9.dhoặc trong một trong những ... (Ubuntu Server 14.04)
F8ER

2
Câu hỏi này đã giúp tôi với điều này: unix.stackexchange.com/questions/28679/ trên
seth10

344

Đặt crontab cho việc này

#crontab -e
@reboot  /home/user/test.sh

sau mỗi lần khởi động nó sẽ chạy tập lệnh thử nghiệm.


4
Đây là giải pháp duy nhất làm việc cho tôi rắc rối miễn phí! cảm ơn bạn
whoopididoo

20
Đây là giải pháp tốt nhất, @reboot sh $HOME/test.shtrong crontab thậm chí còn sạch hơn
user3667089

4
@ user3667089 thực sự, nó không hoạt động. Tôi mở thiết bị đầu cuối, nhập "crontab -e", một cửa sổ xuất hiện, nơi tôi viết trong "@reboot sh /home/user/test.sh" nhưng nó không chạy khi khởi động. Tôi đang làm sai ở đâu?
MycrofD

1
@ user3667089 các dòng mặc định thông thường '# Chỉnh sửa tệp này thành ...' và sau đó là dòng tôi đã viết '@reboot sh /home/.../.sh'. Tôi cũng đã thử '@reboot /home/.../.sh' mà không có "sh" ban đầu nhưng không có kết quả.
MycrofD

3
@MycrofD bạn crontab -lsẽ hiển thị @reboot sh $HOME/test.shđể xác nhận rằng nó thực sự đã được đặt.
dùng3667089

124

Một cách tiếp cận đơn giản là thêm một dòng trong /etc/rc.local:

/PATH/TO/MY_APP &

hoặc nếu bạn muốn chạy lệnh như một người dùng đặc biệt:

su - USER_FOOBAR -c /PATH/TO/MY_APP &

(dấu ampe và nền tảng quá trình và cho phép RC.local tiếp tục thực thi)

Nếu bạn muốn có một tập lệnh init đầy đủ, distian distro có một tệp mẫu, vì vậy:

cp /etc/init.d/skeleton /etc/init.d/your_app

và thích nghi với nó một chút.


2
Cảm ơn! Cách tiếp cận này hóa ra để làm việc tốt nhất với các yêu cầu đơn giản. Tôi khá chắc chắn rằng tôi cần phải chỉ định người dùng, nếu không, khi cần dừng thủ công ứng dụng (bằng cách chạy stop_my_app) tôi sẽ phải làm như vậy với sudo, phải không? Ngoài ra, tôi tự hỏi chính xác chức năng của dấu và (dấu) là gì.
đáp ứng

3
Người dùng phụ thuộc vào ứng dụng của bạn. Nhưng nếu không thực sự cần thiết để chạy như root, hãy tránh nó. &chạy quá trình trong nền
Gilles Quenot

2
sputnick, xin lỗi, nhưng tôi phải đánh dấu Koren là câu trả lời được chấp nhận, chủ yếu là vì những gì @ erikb85 đã chỉ ra, nhưng cũng bởi vì câu hỏi ban đầu của tôi yêu cầu init.dcách làm việc (câu trả lời của bạn lúc đó chỉ là một cách giải quyết đơn giản hơn) . Bài đăng này nhận được rất nhiều lượt xem và bình chọn, vì vậy điều quan trọng là phải giữ chính xác.
đáp ứng

4
Dường như nó được đề cập rằng các dấu và theo dõi quá trình và cho phép RC.local tiếp tục thực thi.
mchicago

Cám ơn vì cái này! Dành vài giờ qua đập đầu vào tường trong khi tôi đang cố gắng thực hiện một dịch vụ, nhưng không có gì hiệu quả. Đã thử điều này, hoạt động như một nét duyên dáng!
Marko Grešak

35

Đây là cách tôi làm trên các hệ thống Red Hat Linux .

Đặt tập lệnh của bạn vào /etc/init.d, sở hữu bởi root và thực thi. Ở đầu kịch bản, bạn có thể đưa ra một chỉ thị cho chkconfig. Ví dụ, tập lệnh sau được sử dụng để khởi động ứng dụng Java với tư cách là người tiên tri.

Tên của kịch bản là /etc/init.d/apex

#!/bin/bash
# chkconfig: 345 99 10
# Description: auto start apex listener
#
case "$1" in
 'start')
   su - oracle -c "cd /opt/apex ; java -jar apex.war > logs/apex.log 2>logs/apex_error.log &";;
 'stop')
   echo "put something to shutdown or kill the process here";;
esac

Điều này nói rằng tập lệnh phải chạy ở cấp 3, 4 và 5 và mức độ ưu tiên cho bắt đầu / dừng là 99 và 10.

Sau đó, với tư cách là người dùng, rootbạn có thể sử dụng chkconfigđể bật hoặc tắt tập lệnh khi khởi động:

chkconfig --list apex
chkconfig --add apex

Và bạn có thể sử dụng service start/stop apex.


Trong thời gian chờ đợi, tôi đã thử nghiệm với một gói có tên là giám sát ( giám sát ) có sẵn trong kho lưu trữ epel. Nó có thể được sử dụng để bắt đầu các chương trình và giám sát chúng, khởi động lại chúng khi thất bại.
Saule

Thay vì nhập: "chkconfig --add service_name" sau khi đặt tập lệnh vào thư mục /etc/init.d/, bạn có thể nhập: "chkconfig service_name trên"
Dragan Radevic

22

Nhập cronbằng sudo:

sudo crontab -e

Thêm một lệnh để chạy khi khởi động, trong trường hợp này là một tập lệnh:

@reboot sh /home/user/test.sh

Tiết kiệm:

Nhấn ESC sau đó: x để lưu và thoát hoặc nhấn ESC rồi ZZ (đó là shift + zz)

Kiểm tra thử nghiệm thử nghiệm :

  1. Chạy kịch bản thử nghiệm của bạn mà không có cron để đảm bảo nó thực sự hoạt động.

  2. Hãy chắc chắn rằng bạn đã lưu lệnh của bạn trong cron, sử dụng sudo crontab -e

  3. Khởi động lại máy chủ để xác nhận tất cả hoạt động sudo @reboot


Tôi rất thích điều này. Cảm ơn! Thi thiên không sử dụng sudonếu bạn muốn chạy một lệnh nhất định trong khi khởi động bằng cách sử dụng người dùng hiện tại.
nguy hiểm89

Thông tin này được lưu trữ ở đâu? Không có trong /tmp??
Peter Mortensen

15

Chỉ cần có một dòng được thêm vào crontab của bạn ..

Hãy chắc chắn rằng tập tin có thể thực thi được:

chmod +x /path_to_you_file/your_file

Để chỉnh sửa tập tin crontab:

crontab -e

Dòng bạn phải thêm:

@reboot  /path_to_you_file/your_file

Thật đơn giản!


Điều này không làm việc cho tôi, tôi đang thiếu gì? # uname -a Linux accton-xp70a0-26-a1 3.11.10-301.fc20.x86_64 #1 SMP Thu Dec 5 14:01:17 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux

Điều này làm việc cho tôi trên CentOs 7. Đối với những người có vấn đề, tôi đã cần tạo một tập lệnh shell, làm cho nó có thể thực thi được (chmod + x file_name) và gọi tập lệnh shell từ cron, từ đó gọi nút path_to_file / index.js
SeanOlson

11

Một tùy chọn khác là có lệnh @reboot trong crontab của bạn.

Không phải mọi phiên bản của cron đều hỗ trợ điều này, nhưng nếu phiên bản của bạn dựa trên Amazon Linux AMI thì nó sẽ hoạt động.


6

Bạn có thể làm được :

chmod +x PATH_TO_YOUR_SCRIPT/start_my_app 

sau đó sử dụng lệnh này

update-rc.d start_my_app defaults 100

Vui lòng xem trang này trên Cyberciti .


1
Tôi có một thiết lập barebone khá, được xây dựng trên yocto và đây là cách duy nhất để làm cho kịch bản của tôi hoạt động. Cảm ơn.
Catalin Vasile

3

Tạo tệp thực thi / init của riêng bạn

Đây không phải là những gì bạn muốn, nhưng nó là niềm vui!

Chỉ cần chọn một tệp thực thi tùy ý, thậm chí là một tập lệnh shell và khởi động kernel với tham số dòng lệnh:

init=/path/to/myinit

Đến cuối khởi động, nhân Linux chạy không gian người dùng đầu tiên thực thi tại đường dẫn đã cho.

Một số dự án cung cấp các inittệp thực thi phổ biến được sử dụng bởi các distro lớn, ví dụ systemd và trong hầu hết các distro init sẽ tạo ra một loạt các quy trình được sử dụng trong hoạt động hệ thống bình thường.

Nhưng chúng ta có thể chiếm quyền điều khiển /init điều nó để chạy các tập lệnh tối thiểu của riêng chúng ta để hiểu rõ hơn về hệ thống của chúng ta.

Đây là một thiết lập có thể tái tạo tối thiểu: https://github.com/cirosantilli/linux-kernel-module-cheat/tree/f96d4d55c9caa7c0862991025e1291c48c33e3d9/README.md#custom-init


2

Giải pháp đơn giản này đã làm việc cho tôi trên một phiên bản Amazon Linux chạy CentOS. Chỉnh sửa /etc/rc.d/rc.localtập tin của bạn và đặt lệnh ở đó. Nó được đề cập trong tệp này rằng nó sẽ được thực thi sau tất cả các tập lệnh init khác. Vì vậy, hãy cẩn thận trong vấn đề đó. Đây là cách tập tin tìm kiếm cho tôi hiện tại. nhập mô tả hình ảnh ở đây. Dòng cuối cùng là tên của kịch bản của tôi.


1

Phương pháp dễ nhất tuyệt đối nếu tất cả những gì bạn muốn chạy là một tập lệnh đơn giản, (hoặc bất cứ điều gì) là nếu bạn có gui để sử dụng hệ thống> tùy chọn sau đó khởi động ứng dụng.

Chỉ cần duyệt đến kịch bản bạn muốn và bạn đi. (làm cho tập lệnh thực thi)


3
Điều này không thực sự chạy khi khởi động, nhưng khi đăng nhập, đó là một sự khác biệt khá lớn. Nó cũng phụ thuộc vào một thiết lập nhất định vì bạn sẽ không có "Hệ thống> Tùy chọn" trên mọi hệ thống (đặc biệt không phải máy chủ).
jazzpi

thuật ngữ tìm kiếm 'linux thực thi khi khởi động' đã đưa tôi đến câu trả lời mà tôi đang tìm kiếm. Mặc dù nó không trả lời câu hỏi của OP, nhưng điều này có thể giúp linux (ub Ubuntu) noobs như tôi, vì vậy nó xứng đáng được nâng cấp. Tôi cũng không thích nó, nhưng đó là chủ nghĩa thực dụng.
thymaro


1

Trong Lubfox tôi đã phải đối phó với tình huống ngược lại. Skype bắt đầu chạy sau khi khởi động và tôi tìm thấy trong ~/.config/autostart/tệp skypeforlinux.desktop. Nội dung của tập tin như sau:

[Desktop Entry]
Name=Skype for Linux
Comment=Skype Internet Telephony
Exec=/usr/bin/skypeforlinux
Icon=skypeforlinux
Terminal=false
Type=Application
StartupNotify=false
X-GNOME-Autostart-enabled=true

Xóa tập tin này đã giúp tôi.


0
  • Thêm tập lệnh của bạn vào thư mục /etc/init.d/
  • Cập nhật cấp độ chạy RC của bạn: $ update-rc.d myScript.sh defaults NNtrong đó NN là thứ tự cần thực hiện. 99 chẳng hạn sẽ có nghĩa là nó sẽ được chạy sau 98 và trước 100.

0

Làm việc với Python 3 microservice hoặc shell; sử dụng Ubuntu Server 18.04 (Bionic Beaver) hoặc Ubuntu 19.10 (Eoan Ermine) hoặc Ubuntu 18.10 (Mực nang vũ trụ) Tôi luôn luôn thích các bước này và nó cũng hoạt động luôn :

  1. Tạo một microservice gọi là ví dụ p "brain_microservice1.service" trong trường hợp của tôi:

    $ nano /lib/systemd/system/brain_microservice1.service
  2. Bên trong dịch vụ mới này mà bạn đang ở:

    [Unit]
    Description=brain_microservice_1
    After=multi-user.target
    
    [Service]
    Type=simple
    ExecStart=/usr/bin/python3.7 /root/scriptsPython/RUN_SERVICES/microservices    /microservice_1.py -k start -DFOREGROUND
    ExecStop=/usr/bin/python3.7 /root/scriptsPython/RUN_SERVICES/microservices/microservice_1.py -k graceful-stop
    ExecReload=/usr/bin/python3.7 /root/scriptsPython/RUN_SERVICES/microservices/microservice_1.py -k graceful
    PrivateTmp=true
    LimitNOFILE=infinity
    KillMode=mixed
    Restart=on-failure
    RestartSec=5s
    
    [Install]
    WantedBy=multi-user.target
  3. Cấp quyền:

    $ chmod -X /lib/systemd/system/brain_microservice*
    $ chmod -R 775 /lib/systemd/system/brain_microservice*
  4. Cho phép thực thi sau đó:

    $ systemctl daemon-reload
  5. Cho phép sau đó, điều này sẽ làm sau đó luôn luôn bắt đầu khi khởi động

    $ systemctl enable brain_microservice1.service
  6. Sau đó, bạn có thể kiểm tra nó;

    $ sudo khởi động lại ngay bây giờ

  7. Kết thúc = THÀNH CÔNG !!

Điều này có thể được thực hiện với cùng một tập lệnh cơ thể để chạy shell, phản ứng ... tập lệnh khởi động cơ sở dữ liệu ... bất kỳ loại mã os nào ... hy vọng điều này sẽ giúp bạn ...

...



0

Đây là một phương pháp đơn giản hơn!

Đầu tiên: viết một kịch bản shell và lưu nó .sh đây là một ví dụ

#!/bin/bash
Icoff='/home/akbar/keyboardONOFF/icon/Dt6hQ.png'
id=13
fconfig=".keyboard"
echo "disabled" > $fconfig
xinput float $id
notify-send -i $Icoff "Internal Keyboard disabled";

kịch bản này sẽ vô hiệu hóa bàn phím nội bộ khi khởi động.

Thứ hai: Mở ứng dụng "Tùy chọn ứng dụng khởi động"

nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây

Thứ ba: nhấp vào Thêm. thứ tư: trong phần NAME đặt tên. five: Trong phần lệnh duyệt đến .sh của bạn. Thứ sáu: chỉnh sửa phần lệnh của bạn thành:

bash <space> path/to/file/<filename>.sh <space> --start

thứ bảy: nhấp vào Thêm. Đó là nó! Đã kết thúc!

Bây giờ xác nhận bằng cách khởi động lại máy tính của bạn.

chúc mừng


-1

Phương pháp không đau, dễ nhất và phổ biến nhất chỉ đơn giản là thực thi nó bằng ~.bash_profilehoặc ~.profile (nếu bạn không có tệp bash_profile) .

Chỉ cần thêm lệnh thực thi ở dưới cùng của tệp đó và nó sẽ được thực thi khi hệ thống khởi động.

Tôi có một cái này ở dưới cùng một ví dụ; ~\Desktop\sound_fixer.sh


2
Điều đó không chính xác. ~/.bash_profilethực thi khi người dùng đăng nhập - không phải khi hệ thống khởi động. Trong câu hỏi ban đầu, mục đích là chạy máy chủ ứng dụng Node.js khi khởi động máy. Giải pháp của bạn sẽ yêu cầu người dùng trước tiên đăng nhập vào máy trước khi máy chủ Node.js chạy. Và, nếu một số loại sự cố khiến máy chủ khởi động lại qua đêm, ứng dụng sẽ không bao giờ hoạt động trở lại cho đến khi con người đăng nhập trở lại.
meetamit

-6

Đối với một số người, điều này sẽ hoạt động:

Bạn chỉ cần thêm lệnh sau vào Hệ thốngTùy chọnỨng dụng khởi động :

bash /full/path/to/your/script.sh

Tôi không thấy điều này trong menu tùy chọn hệ thống. Nhưng tôi thấy nó khi tôi tìm kiếm trong trình khởi chạy ứng dụng.
OKGimmeMoney

Điều này không thực sự chạy khi khởi động, nhưng khi đăng nhập, đó là một sự khác biệt khá lớn. Nó cũng phụ thuộc vào một thiết lập nhất định vì bạn sẽ không có "Hệ thống> Tùy chọn" trên mọi hệ thống (đặc biệt không phải máy chủ).
jazzpi

3
Câu trả lời này có vẻ nhiều hơn cho máy tính để bàn Ubuntu / Linux, nhưng người dùng thực sự đang yêu cầu trợ giúp cho một phiên bản AWS EC2 Linux, theo như tôi biết, không có GUI.
Vini.g.fer
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.