<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Java 實(shí)現(xiàn)程序運(yùn)行狀態(tài)監(jiān)控 之我的思路(守護(hù)進(jìn)程)

     

    Java 實(shí)現(xiàn)程序運(yùn)行監(jiān)控狀態(tài)之我的思路(守護(hù)進(jìn)程)

    問(wèn)題:寫出這個(gè)工具的意義在于我運(yùn)行一個(gè)需要長(zhǎng)時(shí)間執(zhí)行的程序,如單線程爬蟲(chóng)。在網(wǎng)絡(luò)出現(xiàn)中斷的或網(wǎng)站丟包情況下,程序會(huì)拋出socketexception sockettimeoutexception程序會(huì)中斷。(再此只是提出一種假設(shè))

    解決方案:

    Java 并不能像C#一樣對(duì)windows的進(jìn)程進(jìn)行監(jiān)控(資料說(shuō)這是跨平臺(tái)原因)。因此沒(méi)有api 提供對(duì)其他進(jìn)程的監(jiān)控(如果在此您有其他辦法,希望您給出寶貴建議)。所以很多人都是通過(guò)對(duì)文件的加鎖,來(lái)判斷程序是否在運(yùn)行。

    一、判斷當(dāng)前程序是否正在運(yùn)行

    在此我參考了:

    java 對(duì)文件的加鎖。

    http://www.examda.com/Java/jichu/20070411/140527453.html

    (原文地址不知)

    這里的思路是:

    1、 在要監(jiān)視寫的程序中(這里假設(shè)為爬蟲(chóng))對(duì)一個(gè)用來(lái)判斷程序是否運(yùn)行的文件(自定義,無(wú)實(shí)際意義。只是一個(gè)空文件)對(duì)文件進(jìn)行加鎖。

    2、 在守護(hù)程序中寫了簡(jiǎn)單的 循環(huán)來(lái)實(shí)現(xiàn)按時(shí)探測(cè)。這里面比如說(shuō)20秒。

    3、  如果程序確實(shí)在運(yùn)行(即文件不能再被加鎖,因?yàn)橐驯绘i),那么證明程序確實(shí)在運(yùn)行,否則,如果程序出現(xiàn)了網(wǎng)絡(luò)異常而中斷,那么runtime重新調(diào)用該程序。

    (演示代碼如下:注意不要忘了在爬蟲(chóng)程序中需要對(duì)文件進(jìn)行加鎖)。這樣才有效。

    演示代碼:





    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.io.RandomAccessFile;
    import java.nio.channels.FileChannel;
    import java.nio.channels.FileLock;

    import data.BaseDataofConfiguration;

    public class ThreadKeepTools {
        
    /**
        * 通過(guò)文件鎖來(lái)判斷程序是否正在運(yùn)行
        * 
    @return 如果正在運(yùn)行返回true,否則返回false
        
    */

        
    private static boolean isRunning(String fileLockPath)
        
    {
            
    boolean rv=false;
            
    try {
                
    //
                String os_name=System.getProperty("os.name");
                
    //指定文件鎖路徑
                String path=null;
                
    if(os_name.indexOf("Windows")>-1)
                
    {
                    
    //如果是Windows操作系統(tǒng)
                    path=System.getProperty("user.home")+System.getProperty("file.separator");
                }

                
    else
                
    {
                    path
    ="/usr/temp/";
                }

                File dir
    =new File(path);
                
    if(!dir.exists())
                
    {
                    dir.mkdirs();
                }

                
    //程序名稱
                String applicationName="run.bat";
                RandomAccessFile fis 
    = new RandomAccessFile(fileLockPath,"rw");
                FileChannel lockfc 
    = fis.getChannel();
                FileLock flock 
    = lockfc.tryLock();
                
    if(flock == null{
                    System.out.println(
    "程序正在運(yùn)行.");
                    rv
    =true;
                    
                }
    else {
                    flock.release();
                }

                
             
            }
     catch (FileNotFoundException e1) {
                e1.printStackTrace();
            }

            
    catch (IOException e) {
                e.printStackTrace();
            }

            
    return rv;
        }

        
        
    public static void ExcuteThread() throws InterruptedException{
            String strFilePath
    =BaseDataofConfiguration.baseUrlOfPro+"testThread.txt";
            String strBatPath
    =BaseDataofConfiguration.baseUrlOfPro+"run.bat";
            strBatPath
    =strBatPath.replaceFirst("/""");
            
    while(true){
                System.out.println(
    "strFilePath:"+strFilePath);
            
    boolean RunOrNOT=isRunning(strFilePath);
            System.out.println(
    "RunOrNot:"+RunOrNOT);
            
            
    if(!RunOrNOT){
                
    try {
                    System.out.println(
    "開(kāi)始執(zhí)行程序!");
                
                    Runtime.getRuntime().exec(
    "cmd /k start "+strBatPath);
                    System.out.println(
    "strbatpath:"+strBatPath);
                }
     catch (IOException e) {
                    
    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
     
                
            }
    else {
                Thread.sleep(
    6000);
            }

            Thread.sleep(
    10000);
            
            }

        }

        
    public static void main(String[] args) {
            
    try {
                ExcuteThread();
            }
     catch (InterruptedException e) {
                
    // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }

    }




    如果您有更好解決方案,希望您聯(lián)系我。 歡迎留言,提供您寶貴的意見(jiàn)。代碼不規(guī)范,僅供參考。

    # re: Java 實(shí)現(xiàn)程序運(yùn)行狀態(tài)監(jiān)控 之我的思路(守護(hù)進(jìn)程) [未登錄](méi) 2011-05-09 15:36 feenn

    bz提供的方案也挺好的,不過(guò)我覺(jué)得還可以這樣搞:
    1.JNI方式:典型的開(kāi)源項(xiàng)目有:http://sourceforge.net/projects/jsysmonitor/
    2.以爬蟲(chóng)為例,守護(hù)程序與爬蟲(chóng)之間維持一個(gè)連接,使用某種具有連接屬性的協(xié)議,如socket TCP。當(dāng)連接異常斷開(kāi)則認(rèn)為爬蟲(chóng)出錯(cuò)需要重啟,好處是通過(guò)使用事件機(jī)制,可以實(shí)時(shí)監(jiān)控爬蟲(chóng)。當(dāng)然,前提是爬蟲(chóng)源代碼可見(jiàn),且可以修改。
    典型實(shí)現(xiàn):某些大型分布式系統(tǒng)
    3.JConsole方式:http://java.sun.com/developer/technicalArticles/J2SE/jconsole.html,當(dāng)然前提是程序都在JVM中運(yùn)行。

    當(dāng)然,守護(hù)進(jìn)程最高效、最完美的做法是使用C/C++來(lái)編寫,在各種平臺(tái)如Linux/Unix上都有豐富的API可以使用。
    個(gè)人建議,僅供參考。  回復(fù)  更多評(píng)論   

    posted on 2011-05-09 13:42 scorpio小蝎 閱讀(12315) 評(píng)論(4)  編輯  收藏 所屬分類: java

    評(píng)論

    # re: Java 實(shí)現(xiàn)程序運(yùn)行狀態(tài)監(jiān)控 之我的思路(守護(hù)進(jìn)程) [未登錄](méi) 2011-05-09 15:11 scorpio小蝎

    如果您有改進(jìn)建議,或者更好方案,歡迎留言,再次表示感謝  回復(fù)  更多評(píng)論   

    #  kjdwbt.keb kh 2011-05-09 15:16 christian louboutin

    If you’re still on the fence: grab your favorite earphones, head down to a Best Buy

    and ask to plug them into a Zune then an iPod and see which one sounds better to you,

    and which interface makes you smile more. Then you’ll know which is right for you.
      回復(fù)  更多評(píng)論   

    # re: Java 實(shí)現(xiàn)程序運(yùn)行狀態(tài)監(jiān)控 之我的思路(守護(hù)進(jìn)程) [未登錄](méi) 2011-05-09 15:36 feenn

    bz提供的方案也挺好的,不過(guò)我覺(jué)得還可以這樣搞:
    1.JNI方式:典型的開(kāi)源項(xiàng)目有:http://sourceforge.net/projects/jsysmonitor/
    2.以爬蟲(chóng)為例,守護(hù)程序與爬蟲(chóng)之間維持一個(gè)連接,使用某種具有連接屬性的協(xié)議,如socket TCP。當(dāng)連接異常斷開(kāi)則認(rèn)為爬蟲(chóng)出錯(cuò)需要重啟,好處是通過(guò)使用事件機(jī)制,可以實(shí)時(shí)監(jiān)控爬蟲(chóng)。當(dāng)然,前提是爬蟲(chóng)源代碼可見(jiàn),且可以修改。
    典型實(shí)現(xiàn):某些大型分布式系統(tǒng)
    3.JConsole方式:http://java.sun.com/developer/technicalArticles/J2SE/jconsole.html,當(dāng)然前提是程序都在JVM中運(yùn)行。

    當(dāng)然,守護(hù)進(jìn)程最高效、最完美的做法是使用C/C++來(lái)編寫,在各種平臺(tái)如Linux/Unix上都有豐富的API可以使用。
    個(gè)人建議,僅供參考。  回復(fù)  更多評(píng)論   

    # re: Java 實(shí)現(xiàn)程序運(yùn)行狀態(tài)監(jiān)控 之我的思路(守護(hù)進(jìn)程) 2011-05-09 15:43 scorpio小蝎小蝎

    @feenn
    非常感謝feenn 的方案 。這種方案非常成熟,有很多應(yīng)用,大家也可以參考方案  回復(fù)  更多評(píng)論   

    <2011年5月>
    24252627282930
    1234567
    891011121314
    15161718192021
    22232425262728
    2930311234

    導(dǎo)航

    統(tǒng)計(jì)

    常用鏈接

    留言簿

    隨筆分類

    隨筆檔案

    友情鏈接

    搜索

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    主站蜘蛛池模板: 在线不卡免费视频| 中文在线免费不卡视频| 亚洲精品456人成在线| 亚洲国产精品乱码在线观看97| 亚洲AV无码成人精品区蜜桃| 精品国产_亚洲人成在线高清| 国产亚洲无线码一区二区| 国产成人亚洲综合无码精品| 91麻豆精品国产自产在线观看亚洲| 亚洲中文字幕成人在线| 国产啪亚洲国产精品无码 | www在线观看播放免费视频日本| 国产成人精品日本亚洲语音 | 亚洲国产成人久久精品动漫| 亚洲AV无码成人专区片在线观看| 久久久久亚洲AV成人无码| 亚洲丝袜美腿视频| 亚洲国产综合在线| 亚洲一卡2卡三卡4卡无卡下载| 亚洲码和欧洲码一码二码三码| 国产成人亚洲精品无码AV大片| 黄页网址大全免费观看12网站| 国产精品免费久久久久影院 | 亚洲AV无码精品国产成人| 国产亚洲精品美女久久久久 | 亚洲国产日韩在线| 亚洲国产精华液2020| 黄页网站在线观看免费| 成人久久免费网站| 1000部拍拍拍18勿入免费视频软件| 妞干网手机免费视频| 亚洲午夜福利精品久久| 久久亚洲精品视频| 亚洲影视自拍揄拍愉拍| 免费无码午夜福利片| 久久久久久久99精品免费观看| 久热中文字幕在线精品免费| 国产色爽女小说免费看| 亚洲人成网站在线观看播放| 亚洲国产精品成人精品小说| 国产AV无码专区亚洲AV琪琪|