將 Java 程式作為 Linux 的 Daemon 程式以及防止程式多次執行 (轉)
將 作為 的 Daemon 程式以及防止程式多次執行
作者:frogdan
出處:CSDN
(一)使 Java 程式成為 Linux 的 Daemon 程式
Java 程式是編譯後透過 Java 虛擬機器(JVM)解釋的,從執行“java SomeProgram”開始直到程式結束才會
把命令列交還給,中途使用者若退出登入或關閉 則會中斷程式的執行。但現實中有需要做某些不需要和使用者
互動的服務性程式,需要長駐執行又不影響使用者其他工作,如 Linux 的眾多 Daemon 程式一樣。用下面介紹的方法
可以使 Java 程式也做到:
> nohup java SomeProgram &
nohup 是 Linux 的一個命令,可以使其後執行的程式成為 init 的子程式,不受到其他 hangup signals 的影響,
只有用 kill 命令或重啟機器才會消失。而命令列最後的“&”,表示將命令列交還給使用者。
(二)使 Java 程式只允許執行一次,即只允許一個例項保留在記憶體中
有時希望程式只執行一次,再執行的時候提醒本程式已在執行中。但由於 Java 程式由 JVM 執行,除非透過 JNI 技術
或特殊的類庫,否則無法讀取操作的程式,也無法與其他在執行的 JVM 通訊。Java 1.4 新增了 nio 類庫,其中的 FileLock
類可以對操作加鎖,就可以實現以上目的了。下面是實現方法:
import java.io.*;
import java.nio.channels.*;
public final class OneInstance {
public static void main(String[] args) {
System.out.println("Program Start...");
String filename = new String("/tmp/test.txt"); // Here you can change filename to format
File testFile = new File(filename);
RanAccesile raf; // Here you can use either FileInputStream or FileOutputStream
FileChannel fc;
FileLock fl;
try {
testFile.createNewFile();
if (testFile.canWrite() == true) {
raf = new RandomAccessFile(testFile, "rw");
fc = raf.getChannel();
fl = fc.tryLock();
if (fl == null || fl.isValid() == false) {
System.out.println("The File is using by another program!");
} else {
System.out.println("The File is locking by me! My Name is: " + args[0]);
raf.writeChars("I am running... My name is: " + args[0]);
Thread.sleep(1000 * 30); // You can try to run other program between this while
fl.release();
}
raf.close();
}
} catch (FileNotFoundException fnfe) {
System.out.println(fnfe);
} catch (SecurityException se) {
System.out.println(se);
} catch (ClosedChannelException cce) {
System.out.println(cce);
} catch (OverlapFileLockException ofle) {
System.out.println(ofle);
} catch (IOException ioe) {
System.out.println(ioe);
} catch (Exception ex) {
System.out.println(ex);
}
System.out.println("Program End!");
}
}
> javac OneInstance.java
> java OneInstance abc
Program Start...
The File is locking by me! My Name is: abc
(在30秒內開另一個SHELL)
> java OneInstance def
Program Start...
The File is using by another program!
Program End!
注:這是本人在CSDN的第一篇拙作,希望大家多多批評指教!如要轉貼,請加上本人的名字和出處,謝謝!
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-962237/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 建立 SysV 風格的 linux daemon 程式Linux
- Linux中程式與執行緒的概念以及區別Linux執行緒
- 轉載_Linux程式與執行緒的區別Linux執行緒
- opentracker改造為daemon守護程式
- 理解Java程式的執行Java
- MapReduce如何作為Yarn應用程式執行?Yarn
- Linux中程式與程式、執行緒的區別!Linux執行緒
- Golang 包瞭解以及程式的執行Golang
- 執行緒以及多執行緒,多程式的選擇執行緒
- 寫一段java程式來執行linux命令JavaLinux
- Java 程式執行過程Java
- oracle執行java程式碼OracleJava
- CTF逆向:將陣列作為函式程式碼執行陣列函式
- 將程式在後臺執行和殺掉後臺的程式
- Linux程式與執行緒的區別Linux執行緒
- Linux執行緒與程式的區別Linux執行緒
- 程式-程式-執行緒執行緒
- 通過 HelloWorld 瞭解 Java 程式執行過程以及執行時記憶體Java記憶體
- Java™ 教程(程式和執行緒)Java執行緒
- Java程式執行系統命令Java
- Java併發程式設計:Java的四種執行緒池的使用,以及自定義執行緒工廠Java程式設計執行緒
- 淺析Java程式的執行過程Java
- JAVA 程式 在 cmd 視窗的執行Java
- LINUX作業系統知識:程式與執行緒詳解Linux作業系統執行緒
- 程式執行多次後發生訊號量訪問失敗
- Linux程式後臺執行實踐Linux
- 讓.py程式後臺執行(Linux)Linux
- 將Java編譯為原生程式碼Java編譯
- java基礎:執行緒與程式;執行緒的分工,協作,互斥;volatile關鍵字Java執行緒
- Java多執行緒-程式執行堆疊分析Java執行緒
- 【作業系統】程式與執行緒作業系統執行緒
- 執行緒和程式基礎以及多執行緒的基本使用(iOS)執行緒iOS
- java多執行緒程式設計問題以及解決辦法Java執行緒程式設計
- php程式daemon化的正確做法PHP
- 將ES6程式碼轉換為ES5程式碼
- Wpf應用程式作為一個單獨的可執行檔案
- 程式執行緒篇——程式執行緒基礎執行緒
- 【java】【多執行緒】程式、執行緒的基本概念(1)Java執行緒
- 將PaddleOCR 轉為 ONNX 執行