2010-10-13 43 views
18

Tôi đã xây dựng một daemon nhỏ trong Java và tôi muốn chạy nó dưới dạng dịch vụ trong Unix (ví dụ: Debian 5). Tôi đã đọc rằng có khả năng sử dụng trình bao bọc Java, nhưng không có tùy chọn nào khác dễ thực hiện hơn? Tôi không thể sử dụng lệnh Unix như xxx java -jar program.jar?Java đang chạy dưới dạng dịch vụ Unix

+0

http://commons.apache.org/daemon/jsvc.html –

+0

Kiểm tra trong serverfault.com/superuser.com. Hệ thống có thể sẽ biết thêm về điều này (nohup, inittabs, cron, v.v.) – Jayan

Trả lời

29

Vâng, nếu bạn muốn chạy chương trình java của bạn ngay cả khi bạn thoát ra khỏi vỏ bọc của mình, sau đây là cách đơn giản nhất :

$nohup java -jar program.jar & 
+10

xem xét chuyển hướng stderr và stdout như một phần của lệnh. ví dụ. 'nohup java .... 1>/dev/null 2> & 1 &' – JeremyP

1

Bạn có thể sử dụng lệnh cron để lên lịch chương trình của mình. Bạn cũng có thể xem bài viết this để biết chi tiết về cách chạy tập lệnh khi khởi động. Bạn có thể viết một kịch bản chạy chương trình java của bạn và chạy nó khi khởi động như đã đề cập trong bài viết.

+0

Điều này là tốt nếu bạn muốn chạy chương trình định kỳ. Chương trình sau đó sẽ chấm dứt khi thực hiện xong. – KarlP

4

Bạn có thể bắt đầu nó như:

java -jar program.jar 

Các daemon Unix thường bắt đầu bằng init hoặc được bắt đầu bằng tập lệnh trong /etc/init.d hoặc /etc/rc.d và bắt đầu tại runlevel cụ thể - thường bằng liên kết mềm trong /etc/rcX.d. (trong đó X là "runlevel" dự kiến ​​thường là 3.

Tôi nghĩ rằng debian đang chuyển sang sử dụng "khởi động", thay thế init. Nó sử dụng các tệp cấu hình trong /etc/init để xác định công việc và chúng khá dễ dàng

Daemons theo truyền thống đóng stdin, sdtout và stderr, và thực hiện "ngã ba kép" khi bắt đầu, để tách khỏi phiên và cũng để báo hiệu rằng họ sẵn sàng xử lý mọi thứ họ nên xử lý Điều này là không thực sự cần thiết, miễn là daemon không được bắt đầu từ thiết bị đầu cuối

Nếu bạn muốn một trình bao bọc đơn giản để bắt đầu chương trình, bạn chỉ cần viết một vỏ nhỏ cript:

#!/bin/sh 
/full/path/to/java -jar /full/path/to/program.jar 

... và làm cho nó thực thi (chmod 755)

10

Bạn cần tạo tập lệnh thích hợp trong /etc/init.d và liên kết nó với /etc/rcX.d thư mục. Tập lệnh phải hỗ trợ ít nhất các thông số start, stopstatus. Trong khi bắt đầu, nó sẽ chạy lệnh java với các đối số thích hợp, có thể thông qua nohup java <arguments> &. Sau đó, bạn nên lưu PID của quá trình mới bắt đầu của bạn để nộp /var/run/yourservice.pid. stop lệnh nên đọc tập tin PID này và giết dịch vụ này. Các chi tiết khác nhau từ phân phối đến phân phối, hầu hết các bản phân phối cung cấp một số macro để làm cho toàn bộ công việc dễ dàng hơn. Tốt nhất là xem ví dụ về các dịch vụ khác trong /etc/init.d để phân phối của bạn.

Ngoài ra: Nếu dịch vụ của bạn không được truy cập từ các máy tính khác từ mạng, nhưng nó sẽ mở một số cổng, hãy làm cho nó không khả dụng với tường lửa.

Nếu dịch vụ của bạn xử lý một số dữ liệu 'tinh tế', bạn nên thêm một người dùng khác và gọi lệnh sudo thích hợp trong tệp /etc/init.d của mình.

+0

Trên Debian, có một kịch bản được tạo sẵn, bạn có thể sao chép và điều chỉnh theo nhu cầu của mình: '/ etc/init.d/skeleton' – barjak

+0

Trên máy tính Linux có một lệnh tiện ích, 'chkconfig', tạo ra các liên kết trong thư mục'/etc/rcX' cho bạn bằng cách kiểm tra các chú thích định dạng đặc biệt trong kịch bản lệnh của bạn. – Raedwald

Các vấn đề liên quan