Làm cách nào để tạo một tệp jar chạy khi khởi động & và khi bạn đăng xuất?


30

Tôi không biết bắt đầu tìm kiếm ở đâu. Tôi đã đọc về daemon và không hiểu khái niệm này.

Thêm chi tiết:

  • Tôi đã viết một trình thu thập thông tin không bao giờ dừng và thu thập thông tin qua RSS trên internet.
  • Trình thu thập thông tin đã được viết bằng java - do đó, nó là một jar ngay bây giờ.
  • Tôi là quản trị viên trên máy có Ubuntu 11.04.
  • Có một số cơ hội cho máy gặp sự cố, vì vậy tôi muốn trình thu thập thông tin chạy mỗi khi bạn khởi động máy.
  • Hơn nữa, tôi muốn nó tiếp tục chạy ngay cả khi tôi đăng xuất. Tôi không chắc điều này là có thể, nhưng hầu hết thời gian tôi đã đăng xuất và tôi vẫn muốn nó bò.

Có ý kiến ​​gì không? Ai đó có thể chỉ cho tôi đi đúng hướng?

Chỉ cần tìm kiếm giải pháp đơn giản nhất.

Câu trả lời:


32

Đây là một cách dễ dàng để làm điều đó bằng SysVInit. Hướng dẫn:

  1. Tạo sự khởi đầu và tập lệnh dừng của ứng dụng của bạn. Đặt nó trên một số thư mục, trong ví dụ của chúng tôi là:

    • Bắt đầu tập lệnh: /usr/local/bin/myapp-start.sh
    • Dừng viết kịch bản đi: /usr/local/bin/myapp-stop.sh

    Mỗi người sẽ cung cấp các hướng dẫn để chạy / dừng ứng dụng. Ví dụ, myapp-start.shnội dung có thể đơn giản như sau:

    #!/bin/bash
    
    java -jar myapp.jar 

    Đối với tập lệnh dừng, nó có thể là một cái gì đó như thế này:

    #!/bin/bash
    # Grabs and kill a process from the pidlist that has the word myapp
    
    pid=`ps aux | grep myapp | awk '{print $2}'`
    kill -9 $pid
  2. Tạo đoạn script sau ( myscript) và đặt nó vào /etc/init.d.

    /etc/init.d/myscript Nội dung:

    #!/bin/bash
    # MyApp
    #
    # description: bla bla
    
    case $1 in
        start)
            /bin/bash /usr/local/bin/myapp-start.sh
        ;;
        stop)
            /bin/bash /usr/local/bin/myapp-stop.sh
        ;;
        restart)
            /bin/bash /usr/local/bin/myapp-stop.sh
            /bin/bash /usr/local/bin/myapp-start.sh
        ;;
    esac
    exit 0
  3. Đặt tập lệnh để bắt đầu với hệ thống (sử dụng SysV). Chỉ cần chạy lệnh sau ( với quyền root ):

    update-rc.d myscript defaults 

PS: Tôi biết rằng Upstart rất tuyệt và bla bla, nhưng tôi thích hệ thống khởi động SysV cũ.


1
Nhưng làm thế nào để hệ thống sẽ biết tham số nào sẽ sử dụng? Làm thế nào để thiết lập là "bắt đầu". Đã thử ở đây và nó không hoạt động.
John John Pichler

1
Điều này hoạt động, nhưng lệnh "dịch vụ myapp start" không thoát lệnh.
Tobia

Bây giờ làm thế nào để sử dụng các tùy chọn start | stop | restart trong myscript?
Codevalley

Ngoài ra, ngay cả sau khi thực hiện 3 bước, jar của tôi không chạy khi khởi động. Bạn có chắc chắn nếu chúng ta phải thay đổi quyền, hoặc đường dẫn hoặc một cái gì đó tương tự?
Codevalley

@Codevalley, như tôi đã đề cập, phương pháp này dành cho init SysV. Để sử dụng dịch vụ hoặc lệnh khác, bạn sẽ cần phải viết một công việc mới. Nhưng nếu bạn định làm điều này, bạn nên viết một hệ thống (vì nó đang trở thành tiêu chuẩn)
Marcos Roriz Junior

6

Vâng! Điều đó là có thể. :) Upstart là cách để đảm bảo dịch vụ vẫn hoạt động. Nó có năm gói, tất cả được cài đặt theo mặc định:

  • Khởi động tiện ích init daemon và initctl
  • upstart-logd cung cấp tệp dad logd và tệp định nghĩa công việc cho dịch vụ logd
  • upstart-compat-sysv cung cấp các tệp định nghĩa công việc cho các tác vụ RC và các công cụ khởi động lại, runlevel, shutdown và telinit cung cấp khả năng tương thích với SysVinit
  • nhiệm vụ khởi động cung cấp các tệp định nghĩa công việc cho các nhiệm vụ khởi động hệ thống
  • dịch vụ hệ thống cung cấp các tệp định nghĩa công việc cho các dịch vụ tty

Việc học rất thú vị và đáng giá. Upstart có một trang web: http://upstart.ubfox.com/


Từ trang web Upstart, kể từ năm 2019: "Dự án chỉ ở chế độ bảo trì. Không có tính năng mới nào được phát triển và lời khuyên chung sẽ là chuyển sang hệ thống init tối thiểu hoặc systemd khác"
Nav

2

3 gợi ý nhanh ...

  1. Tạo một tập lệnh tart S/etc/rc3.d (chế độ bảng điều khiển nhiều người dùng) với các tập lệnh K ill tương ứng /etc/rc.0/etc/rc6.dđể giết chương trình Java của bạn theo cách được kiểm soát khi hệ thống tắt (runevel 0) hoặc khởi động lại (runlevel 6) Xem phần Giới thiệu về Runlevels .

    Bạn có thể có thể khởi động ứng dụng Java của mình trong runlevel 2 (rc2.d) nhưng, với tư cách là một trình thu thập thông tin, nó sẽ cần TCP / IP. Vì vậy, hãy chắc chắn rằng dịch vụ mạng của bạn đã có sẵn / bắt đầu trong runlevel 2 của bạn trước đó. Mạng chắc chắn là lên trong runlevel 3.

    /etc/init.dchứa tất cả các tập lệnh start / kill thực tế. /etc/rcN.dcác thư mục chỉ chứa các liên kết đến chúng, có tiền tố là S hoặc K để bắt đầu hoặc giết chúng tương ứng, trên mỗi runlevel N.

  2. Một quá trình được chạy bởi crondnên tồn tại giữa các lần đăng xuất. Có thể thêm nó vào crontab của bạn.

  3. Một quá trình chạy với nohupcũng nên tồn tại. Xem nohup: chạy một lệnh ngay cả sau khi bạn đăng xuất .

    $ nohup java -jar myapp.jar &

    Theo mặc định, myapp.jarđầu ra tiêu chuẩn sẽ chuyển đến một tệp có tên ./nohup.outhoặc $HOME/nohup.outnếu trước đây không thể ghi được.


Và khi tôi đăng xuất, nó vẫn chạy trên nền chứ?
RanZilber

0

Cũng cần lưu ý khi thực hiện các ứng dụng với:

  update-rc.d myscript defaults 

Để có quyền 0755 và sử dụng hoặc nhận trước đường dẫn .sh của bạn. Giả sử tập lệnh của bạn là trên /root/test.sh, trước tiên bạn nên thay đổi thành CD /root/trước khi truy cập test.sh.

Vì vậy, cách tốt nhất là tạo một SH trên init.d và ở đó thay đổi đường dẫn đến của bạn shvà thực hiện nó trong hàm start.



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.