Nếu bạn không thể dựa vào Java Service Wrapper trích dẫn elsewhere (ví dụ, nếu bạn đang chạy trên Ubuntu, trong đó có không có phiên bản đóng gói của SW), bạn có thể muốn làm điều đó theo cách cũ thời: có chương trình của bạn viết PID của nó trong /var/run/$progname.pid, và viết một kịch bản init chuẩn SysV (sử dụng ví dụ cho một ntpd làm ví dụ, nó đơn giản) xung quanh nó. Tốt hơn, làm cho nó tương thích với LSB.
Về cơ bản, hàm bắt đầu kiểm tra nếu chương trình đã chạy (bằng cách kiểm tra nếu /var/run/$progname.pid tồn tại và nội dung của tệp đó là PID của tiến trình đang chạy) và nếu không chạy
logfile=/var/log/$progname.log
pidfile=/var/run/$progname.pid
nohup java -Dpidfile=$pidfile $jopts $mainClass </dev/null > $logfile 2>&1
các kiểm tra chức năng dừng trên /var/run/$progname.pid, kiểm tra nếu tập tin đó là PID của một quá trình hoạt động, xác nhận rằng nó là một máy ảo Java (như vậy là không để giết một quá trình đơn giản chỉ cần sử dụng lại PID từ một trường hợp chết của daemon Java của tôi) và sau đó giết chết quá trình đó.
Khi được gọi, phương thức main() của tôi sẽ bắt đầu bằng cách viết PID của nó trong tệp được định nghĩa trong System.getProperty ("pidfile").
Một rào cản lớn, mặc dù:. Trong Java, không có cách nào đơn giản và tiêu chuẩn để có được PID của tiến trình JVM chạy trong
Dưới đây là những gì tôi đã đưa ra:
private static String getPid() {
File proc_self = new File("/proc/self");
if(proc_self.exists()) try {
return proc_self.getCanonicalFile().getName();
}
catch(Exception e) {
/// Continue on fall-back
}
File bash = new File("/bin/bash");
if(bash.exists()) {
ProcessBuilder pb = new ProcessBuilder("/bin/bash","-c","echo $PPID");
try {
Process p = pb.start();
BufferedReader rd = new BufferedReader(new InputStreamReader(p.getInputStream()));
return rd.readLine();
}
catch(IOException e) {
return String.valueOf(Thread.currentThread().getId());
}
}
// This is a cop-out to return something when we don't have BASH
return String.valueOf(Thread.currentThread().getId());
}
Vui lòng xem http://stackoverflow.com/questions/407016/how-to-convert-an-existing-java-application-to-a-sys-v-service-daemon –
Thử 'nohup java prog &' . – ceving
Một cách sạch hơn để quản lý dịch vụ tại UNIX https://cr.yp.to/daemontools.html – Velu