cấu hình java daemon với systemd


11

Tôi đang sử dụng định nghĩa này cho một systemdcông việc:

 [Unit]
 Description=Some job

 [Service]
 ExecStart=/usr/local/sbin/somejob
 User=dlt
 Type=forking

 [Install]
 WantedBy=multi-user.target

Kịch bản được gọi là như sau (gọi một thói quen đơn giản nghe trên ổ cắm tcpip và nối thêm đầu vào vào một tệp):

 #!/bin/sh

 cd /home/user/tmp/testout
 nohup java -jar /home/user/programming/tests/java/core/SocketTest/SocketTest.jar </dev/null >/dev/null &

Sau khi systemctl start somejobquá trình hiển thị là đang chạy, với inittư cách là cha mẹ của nó:

 user@CANTANDO ~$ ps -u dlt eo pid,ppid,command
   PID  PPID COMMAND
  8718     1 java -jar /home/user/programming/tests/java/core/SocketTest/SocketTest.jar

Sau khi thực hiện systemctl stop somejobquy trình không hiển thị nữa (và cổng bị đóng).

Vì vậy, mọi thứ có vẻ tốt và bảnh bao

Câu hỏi của tôi là: Đây có phải là một giải pháp chấp nhận được để chạy java daemon với systemd, hoặc có cảnh báo không, và do đó, các cách khác ổn định hơn hoặc an toàn hơn để đạt được điều này?

Câu trả lời:


14

Dưới đây là một số sửa đổi nhỏ:

  1. Vì nó lắng nghe trên một ổ cắm mạng, làm cho nó phụ thuộc vào network.target.
  2. nohuplà không cần thiết vì systemdsẽ daemonize thực thi cho bạn.
  3. Tôi nghĩ rằng một tập lệnh shell riêng biệt sẽ là quá mức cần thiết, vì vậy chỉ cần hợp nhất nó vào tập tin dịch vụ.
  4. Chuyển hướng ( < /dev/nullvà vv) không cần thiết vì systemd thiết lập bối cảnh I / O tiêu chuẩn thích hợp. Thật vậy, nếu bạn chuyển hướng ra systemd sẽ ghi lại mọi thứ được gửi đến đầu ra tiêu chuẩn của chương trình Java trong tạp chí của nó, không cần cơ chế ghi nhật ký đặc biệt nào.
  5. Chạy không đồng bộ từ shell invoke ( &) là không cần thiết hoặc không phù hợp.
  6. Có một mô hình hành vi cụ thể được yêu cầu bởi Type=forking, và nếu nó không theo sau thì mọi thứ sẽ sai. Vì vậy, hãy thử cho Type=simple(hoặc Type=notify).

Vì vậy, tệp dịch vụ trông như thế này:

[Unit]
Description=Some job
After=network.target

[Service]
WorkingDirectory=/home/user/tmp/testout
SyslogIdentifier=SocketTest
ExecStart=/bin/sh -c "exec java -jar /home/user/programming/tests/java/core/SocketTest/SocketTest.jar"
User=dlt
Type=simple

[Install]
WantedBy=multi-user.target

Ghi chú:

  1. Bạn không thể chỉ sử dụng javalàm tên của chương trình để chạy. systemd không tìm kiếm PATHcác tệp thực thi và tên của tệp thực thi được cung cấp ExecStartphải là tuyệt đối. Vì vậy, nếu bạn muốn tìm kiếm đường dẫn, bạn phải gọi qua shell hoặc /usr/bin/env. Chúng tôi chọn /bin/shở đây.
  2. Bởi vì đây là Type=simpleshell phải execJava, không chạy nó như một tiến trình con. systemd kiểm soát dịch vụ thông qua quy trình chính và đó phải là Java, không phải là quy trình shell cha.
  3. Bởi vì điều này không gọi trực tiếp thực thi Java, systemd sẽ đặt tên shtrong tạp chí của nó làm tên dịch vụ. Xem Cách tránh / usr / bin / env được đánh dấu trong nhật ký systemd là tệp thực thi để biết thêm về điều này.

Theo tôi biết, không có sự cảnh báo đặc biệt nào về việc chạy ứng dụng Java với Systemd.


1
Điều đó sẽ không làm việc. Vấn đề 1: Đây không phải là vỏ; không có toán tử chuyển hướng. Dù sao thì bạn cũng không muốn chuyển hướng đó. Vấn đề 2: ExecStart yêu cầu tên đường dẫn tuyệt đối. Vấn đề 3: unix.stackexchange.com/questions/229523
JdeBP

Đẹp lên đầu. Tôi chỉ có thể quản lý để khắc phục sự cố 1. Làm thế nào để bạn sửa lỗi 2,3?
Yun-Chih Chen

1
Xem câu trả lời như đã chỉnh sửa.
JdeBP

Tôi không nghĩ rằng sh là cần thiết ở đây.
faho

Xin chào @ Yun-ChihChen làm thế nào để bạn dừng quá trình. ExecStrop sẽ trông như thế nào? Tôi đã sử dụng init.d cùng với tệp pid nhưng thấy việc này dễ dàng hơn. Vì vậy, tôi cần phải chắc chắn rằng mình biết cách dừng lại, v.v ... Cảm ơn
black sensei
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.