jar как демон на Ubuntu использует 100% процессор - PullRequest
1 голос
/ 16 ноября 2011

Я запускаю JAR-файл как демон.Это простое приложение для сканирования, которое запускает поток, который сканирует папку.Я использую sleep 60000ms, поэтому, если я запускаю приложение на своем Mac, загрузка процессора приближается к 0%.

Если я запускаю jar в качестве демона на 32-битном сервере Ubuntu, он потребляет 100% процессора в режиме ожидания (например,в папке нет файлов.

sudo start-stop-daemon --start --quiet -b -m --pidfile /var/run/filecom.pid --exec /usr/bin/java -- -Xms128m -Xmx128m -jar /apps/FileCom/filecom.jar

Что я делаю не так?

Спасибо

РЕДАКТИРОВАТЬ

Я делаю Thread.sleep (60000).Когда я не запускаю его как демон, он не потребляет так много процессора.Я предполагаю, что это как-то связано с моим демоном.

public void run() 
{
    //Create our root folder (folder to scan)
    File root = new File(rootFolder);

    //Start the loop
    while(true)
    {
        //List all files in the root folder
        File[] filesInRoot = root.listFiles();

        Arrays.sort( filesInRoot, new Comparator<Object>()
        {
            public int compare(Object o1, Object o2) 
            {
                if (((File)o1).lastModified() < ((File)o2).lastModified()) 
                {
                    return -1;
                } 
                else if (((File)o1).lastModified() > ((File)o2).lastModified()) 
                {
                    return +1;
                } 
                else 
                {
                    return 0;
                }
                }

        }); 

        //If there are no files in the target folder then move the first file in the array
        if(filesInRoot.length>0)
        {

            LogUtil.write(">> Finds file in in queue: " + filesInRoot[0].getName());

            //Check that the file has been written, EOF
            if(checkEOF(filesInRoot[0]))
            {
                LogUtil.write(">> File is complete, preparing to move");
                    //Rename the file using time and date - to make it unique
                    Calendar cal = Calendar.getInstance();
                    SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
                    Long time = cal.getTimeInMillis();
                    String fileprefix = sdf.format(cal.getTime())+time.toString();
                    String processFileName = fileprefix+"_"+filesInRoot[0].getName();
                    //Move the file and rename it
                    File processFile = new File(processFolder, processFileName);

                    boolean success = filesInRoot[0].renameTo(processFile);

                    if (success) 
                    {
                        LogUtil.write(">> Success: File was moved to "+processFolder);
                        LogUtil.write(">> Processing....");


                        try 
                        {   
                            //Do stuff

                         } 
                         catch (Exception e) //Handles all errors
                         {

                            LogUtil.write(e);
                         }
                         finally
                         {
                            //Create backup of the infile (outfile is bupped in writeResponseObject)
                            File bupInFile = new File(bupFolder+"/in", processFileName);
                            processFile.renameTo(bupInFile);
                            LogUtil.write(">> inFile backed up: "+bupInFile.getAbsolutePath());
                         }
                     }   
                     else
                     {
                         LogUtil.write(">> Failure: File could not be moved ");
                     }
                }
            else
            {
                LogUtil.write(">> Failure: file is still beeing written...");
            }
                try 
                {
                    Thread.sleep(FileCom.PROSchedule);
                } 
                catch (InterruptedException ie) 
                {
                    ie.printStackTrace();
                }
            }

    }

Ответы [ 3 ]

1 голос
/ 17 ноября 2011

Глядя на код, фигурные скобки не совсем совпадают, и похоже, что вы спите, только если в папке есть файлы.

Попробуйте свой код демона с файлом в папке и посмотрите, продолжает ли загружаться ЦП.

Кроме того, это помогает, если вы используете правильный отступ с вашим кодом.

0 голосов
/ 17 ноября 2011

--- Отредактировано после того, как вы отправили код ---

Ваша проблема в этом блоке строки кода

    if(filesInRoot.length>0) {
            ... a lot of stuff goes here ...
            try 
            {
                Thread.sleep(FileCom.PROSchedule);
            } 
            catch (InterruptedException ie) 
            {
                ie.printStackTrace();
            }
    }

Так что если filesInRoot.length == 0, вы не спите.

Вам нужно изменить код следующим образом:

    if (filesInRoot.length > 0) {
      ... a lot of stuff goes here ...
    }

    try {
      Thread.sleep(FileCom.PROSchedule);
    } catch (InterruptedException ie) {
      ie.printStackTrace();
    }

--- Исходный пост следует ---

Возможно, вы делаете предположение, которое подходит для MacOSX, но не удаетсяв убунту.Кто знает, вы можете использовать процессор на 100%, потому что вы никогда не вводите блок кода, в котором находится ваш sleep(...).

Исходный код идеально подходит для проведения соответствующих обсуждений по таким темам.Без этого все становится игрой в догадки.Многие из нас умеют догадываться, но нам не нравится это делать.Он слишком подвержен ошибкам, и нам нравится поддерживать репутацию, по крайней мере, пытаясь предоставить полезную помощь.

Попробуйте поместить соответствующий код в очень маленькую примерную программу.В лучшем случае вы обнаружите и решите свою собственную проблему, прежде чем закончить пример.В худшем случае у вас будет рабочий пример отличающегося поведения, которое позволит другим предоставить вам значимые релевантные решения.

0 голосов
/ 17 ноября 2011

Во-первых, было бы полезно, если бы вы опубликовали код, который фактически выполняет сканирование папок. Эти API имеют очень разные реализации в виртуальной машине для каждой ОС, поэтому нет ничего необычного в том, что вы испытываете различные варианты поведения.

Во-вторых, является ли ваш код непрерывным циклом while без какого-либо спящего потока в Java? Если так, то это не очень хорошо. Вы должны дать вашему коду время ожидания / выхода, и вы должны делать это в Java, а не в командной строке, чтобы виртуальная машина должным образом обращалась к планировщику ОС для планирования потоков и т. Д.

Во всяком случае, причина, по которой вы получаете лучшее использование ЦП в OS / X, может быть связана с агрессивной приоритетностью этой ОС, которая не позволяет всему, что не делает ничего «полезного», перегружать ЦП.

...