2012-02-24 39 views
22

Tôi đã phát triển một kết nối máy chủ socket Java đang hoạt động tốt.Quá trình nền trong linux

Khi bắt đầu từ một thiết bị đầu cuối, nó bắt đầu từ việc nghe từ khách hàng. Nhưng khi tôi đóng thiết bị đầu cuối nó dừng nghe.

Tôi cần tiếp tục ngay cả khi thiết bị đầu cuối đã đóng bởi người dùng từ nơi tệp jar được bắt đầu.

Làm cách nào để chạy ứng dụng trình cắm Java máy chủ trong Linux làm quá trình nền?

+0

http://stackoverflow.com/questions/2151214/is-it-possible-to-double-fork-a-process-in-java – tMC

Trả lời

30

Có một số cách bạn có thể đạt được một điều như vậy:

  1. nohup java -server myApplication.jar > /log.txt - điều này là khá thẳng về phía trước. Nó sẽ chỉ đưa ứng dụng vào nền. Điều này sẽ làm việc nhưng nó không chỉ là một cách rất tốt để làm như vậy.
  2. Sử dụng trình bao bọc vỏ và ứng dụng OR daemon ở trên. Cách tiếp cận này được sử dụng bởi nhiều dự án nguồn mở và nó khá tốt cho hầu hết các kịch bản. Ngoài ra, nó có thể được bao gồm trong init.d và mức chạy yêu cầu với lệnh bắt đầu, dừng và trạng thái thông thường. Tôi có thể cung cấp một ví dụ nếu cần thiết.
  3. Tạo máy chủ daemon của riêng bạn bằng cách sử dụng Java Service Wrapper hoặc Apache Jakarta Commons Daemon. Một lần nữa - cả hai đều rất phổ biến, được thử nghiệm và đáng tin cậy. Và có sẵn cho cả Linux và Windows! Một từ Apache Commons được sử dụng bởi máy chủ Tomcat! Ngoài ra còn có Akuma.

Cá nhân tôi sẽ đi với giải pháp 2 hoặc 3 nếu bạn cần sử dụng máy chủ này trong tương lai và/hoặc phân phối nó cho khách hàng, người dùng cuối, v.v. nohup là tốt nếu bạn cần điều gì đó và không có thời gian để phát triển giải pháp phức tạp hơn cho vấn đề.

Quảng cáo 2:

Các kịch bản tốt nhất, được sử dụng bởi nhiều dự án, có thể được tìm thấy here.

Đối với Debian/Ubuntu, người dùng có thể sử dụng tập lệnh rất đơn giản dựa trên start-stop-daemon. Nếu nghi ngờ có /etc/init.d/skeleton, người ta có thể sửa đổi.

#!/bin/sh 

DESC="Description" 
NAME=YOUR_NAME 
PIDFILE=/var/run/$NAME.pid 
RUN_AS=USER_TO_RUN 
COMMAND=/usr/bin/java -- -jar YOUR_JAR 

d_start() { 
    start-stop-daemon --start --quiet --background --make-pidfile --pidfile $PIDFILE --chuid $RUN_AS --exec $COMMAND 
} 

d_stop() { 
    start-stop-daemon --stop --quiet --pidfile $PIDFILE 
    if [ -e $PIDFILE ] 
     then rm $PIDFILE 
    fi 
} 

case $1 in 
    start) 
    echo -n "Starting $DESC: $NAME" 
    d_start 
    echo "." 
    ;; 
    stop) 
    echo -n "Stopping $DESC: $NAME" 
    d_stop 
    echo "." 
    ;; 
    restart) 
    echo -n "Restarting $DESC: $NAME" 
    d_stop 
    sleep 1 
    d_start 
    echo "." 
    ;; 
    *) 
    echo "usage: $NAME {start|stop|restart}" 
    exit 1 
    ;; 
esac 

exit 0 
+0

Rzanek Cảm ơn bạn đã trả lời. Tôi muốn đi với tùy chọn 2. Nếu bạn có thể cung cấp cho tôi một ví dụ. – user861973

1

Bạn đã thử đặt & vào cuối dòng lệnh chưa? Ví dụ:

java -jar mySocketApp.jar & 

Bạn cũng có thể sử dụng bgfg lệnh để gửi một quá trình để nền và foreground. Bạn có thể tạm dừng quá trình chạy bằng cách CTRL + Z.

Kiểm tra nó ra bài viết này: http://lowfatlinux.com/linux-processes.html

1

thử,

java -jar yourApp.jar & 

& sẽ bắt đầu chủ đề quy trình mới, tôi đã không kiểm tra này, nhưng nếu nó vẫn không hoạt động thì giống chim hồng tước nó trong tập tin kịch bản và bắt đầu tôi với &

5

Có một điều quan trọng bạn cần làm sau khi thêm & vào cuối lệnh. Quá trình này vẫn được liên kết với thiết bị đầu cuối. Bạn cần chạy disown sau khi chạy lệnh java.

java -jar yourApp.jar > log.txt & 
disown 

Bây giờ, bạn có thể đóng thiết bị đầu cuối.

+1

lệnh đó không hoạt động đối với tôi tôi cần 'java -jar yourApp .jar> log.txt & 'bằng cách sử dụng ubuntu, không phải' & 'ở cuối – wired00

3

Cụm từ khóa bạn cần ở đây là "làm daemon một quy trình". Bao giờ tự hỏi tại sao các quá trình máy chủ hệ thống thường kết thúc bằng 'd' trên Linux/Unix? Chữ 'd' là viết tắt của "daemon", vì lý do lịch sử.

Vì vậy, quá trình tách và trở thành một quá trình máy chủ thực sự được gọi là "daemonization".

Điều này hoàn toàn chung chung và không chỉ giới hạn ở các quy trình Java.

Có một số tác vụ bạn cần làm để trở thành một quy trình daemon thực sự độc lập. Chúng được liệt kê trên trang Wikipedia.

Hai điều chính bạn cần phải lo lắng về việc là:

  • Detach từ quá trình cha mẹ
  • tách khỏi tty đã tạo ra quá trình

Nếu bạn google cụm từ "daemonizing một quá trình ", bạn sẽ tìm thấy một loạt các cách để thực hiện việc này và một số chi tiết khác về lý do tại sao cần thiết.

Hầu hết mọi người chỉ sử dụng một tập lệnh shell nhỏ để bắt đầu quá trình java và sau đó hoàn thành lệnh java bằng '&' để khởi động ở chế độ nền. Sau đó, khi quá trình khởi động kịch bản thoát, quá trình java vẫn đang chạy và sẽ được tách ra khỏi quá trình tập lệnh đã chết.

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