Chạy tệp jar java trên máy chủ làm quá trình nền


105

Tôi cần chạy một java jar trong máy chủ để giao tiếp giữa hai ứng dụng. Tôi đã viết hai tập lệnh shell để chạy nó, nhưng khi tôi khởi động tập lệnh đó, tôi không thể tắt / chấm dứt quá trình. Nếu tôi nhấn ctrl+ Choặc đóng bảng điều khiển, máy chủ sẽ tắt. Bất cứ ai có thể giúp tôi cách sửa đổi tập lệnh này để chạy như một máy chủ bình thường?

 #!/bin/sh
java -jar /web/server.jar
echo $! 
#> startupApp.pid

Câu trả lời:


242

Bạn có thể thử điều này:

#!/bin/sh
nohup java -jar /web/server.jar &

Biểu tượng &, chuyển chương trình sang chạy ẩn.

Tiện ích nohup làm cho lệnh được truyền dưới dạng đối số chạy ở chế độ nền ngay cả sau khi bạn đăng xuất.


Cảm ơn Anton, thực sự tôi đang dừng máy chủ bằng cách giết id quy trình. Tôi không nghĩ đó là phương pháp hay nhất. Lệnhry để dừng máy chủ có phải không?
Bernad Ali,

3
Câu trả lời ngắn gọn: nó phụ thuộc vào máy chủ. Câu trả lời dài: theo như tôi biết, không có cách nào an toàn để đóng một quy trình mà không có quy trình hỗ trợ việc đóng cửa duyên dáng như vậy. Ví dụ: nếu đó là một máy chủ web bị kết thúc bởi một tín hiệu bên ngoài, luôn có khả năng một số yêu cầu sẽ bị mất. Một cách để giải quyết vấn đề này là thực hiện một chức năng kết thúc duyên dáng trong chính máy chủ, ví dụ: bằng cách xử lý một loại yêu cầu đặc biệt. Sau đó, máy chủ có thể được kết thúc bằng cách gửi cho nó một yêu cầu thuộc loại đặc biệt đó. Nếu không, giết tiến trình bằng ID của nó là cách đơn giản.
Anton Beloglazov

1
Việc sử dụng nohupphải luôn được kết hợp với chuyển hướng stdout và stderr một cách rõ ràng - nếu không, bạn sẽ không kiểm soát được vị trí của các bản ghi và kết thúc với một tập lệnh xấu xí nohup.outđược tạo ra trong bất kỳ thư mục nào mà tập lệnh này tình cờ được gọi ra.
Charles Duffy

@Anton khi tôi chạy một tập lệnh (giống như câu trả lời của bạn) với SSH EXEC runjar.sh. Nó bắt đầu phát trực tuyến nhật ký trong thiết bị đầu cuối cục bộ của tôi và nếu đóng thiết bị đầu cuối của tôi thì bình của tôi sẽ bị giết. Làm cách nào để chạy một jar trong nền bằng SSH EXEC?
AATHITH RAJENDRAN

47

Systemd hiện chạy trong phần lớn các bản phân phối

Bước 1:

Tìm dịch vụ do người dùng xác định của bạn, dịch vụ của tôi đã ở /usr/lib/systemd/system/

Bước 2:

Tạo tệp văn bản với tên trình soạn thảo văn bản yêu thích của bạn whatever_you_want.service

Bước 3:

Đặt Mẫu sau vào tệpwhatever_you_want.service

[Unit]
Description=webserver Daemon

[Service]
ExecStart=/usr/bin/java -jar /web/server.jar
User=user

[Install]
WantedBy=multi-user.target

Bước 4:

Chạy dịch vụ của bạn
với tư cách là siêu người dùng

$ systemctl start whatever_you_want.service # starts the service
$ systemctl enable whatever_you_want.service # auto starts the service
$ systemctl disable whatever_you_want.service # stops autostart
$ systemctl stop whatever_you_want.service # stops the service
$ systemctl restart whatever_you_want.service # restarts the service

Đây là cách hiện đại để làm điều đó
EarthMind vào

4
trên hình ảnh AWS ubutnu tôi phải cài đặt systemd sau đó tìm thấy các hình ảnh trong / etc / systemd / system /
Robbo_UK

29

Nếu bạn đang sử dụng Ubuntu và có "Upstart" ( http://upstart.ubuntu.com/ ), bạn có thể thử cách này:

Tạo nên /var/init/yourservice.conf

với nội dung sau

description "Your Java Service"  
author "You"  

start on runlevel [3]  
stop on shutdown  

expect fork  

script     
    cd /web 
    java -jar server.jar >/var/log/yourservice.log 2>&1  
    emit yourservice_running  
end script  

Bây giờ bạn có thể ra lệnh service yourservice startservice yourservice stop. Bạn có thể điều chỉnh /var/log/yourservice.logđể xác minh rằng nó đang hoạt động.

Nếu bạn chỉ muốn chạy jar của mình từ bảng điều khiển mà không cần đến cửa sổ bảng điều khiển, bạn chỉ có thể làm:

java -jar /web/server.jar > /var/log/yourservice.log 2>&1

3
Đó có phải là một dịch vụ systemd không? Câu hỏi này không được gắn thẻ linux, và rất ít bản phân phối có systemd theo mặc định.
jordanm

1
Tôi sẽ sửa đổi câu hỏi để nói rằng điều này đang sử dụng "mới nổi" được bao gồm trong ubuntu.
Strelok

1
Tôi tin rằng lời khuyên cuối cùng nếu bạn muốn nó chạy ở chế độ nền và vỏ được giải phóng, bạn nên làm: java -jar /web/server.jar > /var/log/yourservice.log 2>&1 &
Montaro

Tất cả các công việc hệ thống theo mặc định đều nằm trong thư mục sau: / etc / init / ... Theo mặc định, không có thư mục / var / init / trong Ubuntu 14.04.
Michael Lafayette

Ngoài ra, bắt đầu một dịch vụ yêu cầu "sudo". dịch vụ sudo của bạn bắt đầu dịch vụ
Michael Lafayette

2

Chạy trong nền và thêm nhật ký vào tệp nhật ký bằng cách sử dụng như sau:

nohup java -jar /web/server.jar > log.log 2>&1 &
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.