將 Java 程式作為 Linux 的 Daemon 程式以及防止程式多次執行 (轉)

worldblog發表於2007-08-16
將 Java 程式作為 Linux 的 Daemon 程式以及防止程式多次執行 (轉)[@more@]

將 作為 的 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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章