1. Java / Говнокод #4842

    +85

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    8. 8
    if( str.substring(0,3).equals("110")){
                   //restarting client
                   c.close();
                   Thread.sleep(100);
                   main(args);
                   System.gc();
                   System.exit(1);
               }

    Brutal restart

    Запостил: maltozzi, 07 Декабря 2010

    Комментарии (22) RSS

    • Рекурсивный рестарт? Что-то новое.
      Ответить
    • сомневаюсь что рестарт что-то рестартит
      Ответить
      • Не сомневайся, рестартит на ура
        Ответить
        • сомневаюсь
          Ответить
          • Ну, у меня как-то работало
            Ответить
            • я даже знаю через какое место

              а вообще рестарт реализуется так:
              1. нужен бутстраппер, пусть даже примитивный батник, но лучше на сях каких
              2. делаем корректно выход (не убиваем всю виртуальную машину exit'ом), то есть грамотно дожидаемся завершения всех потоков, пишем наружу что хотим не выход а рестарт
              3. бутстраппер ждет завершения явы, и смотрит выход, и если от явапроги пришло желание еще раз запуститься, запускает еще раз, если нет, умирает сам
              Ответить
              • желание перезапускать машину говорит о херовенькой архитектуре)))

                а вообще да -- ничто не мешает запустить процес
                дождаться кода возврата
                и если он не нулевой -- перезапустить процесс

                я такой бутстраппер-батник сделать могу))
                Ответить
                • вот и чудненько ))
                  батники очень полезны в качестве запускалок-по-двойному-щелчку, недостатка два:
                  1.тока в выньде
                  2.пока ява жива, видна черная консоль, только мешающая юзверам, сбивающая с толку и искушающая нажать на правый верхний крест.
                  Ответить
    • лол. я подобное делал в одном С-шном серваке под юнихами: если менялась конфигурация и/или ехе-шник на диске, то я просто делал exec() самого себя со спец параметрами. работало на ура. но в Жабе подобные фокусы однозначно работать не будут.
      Ответить
      • задолго до Вас это сделал Оллман.
        Его программа sendmail запускала сама себя для разных задач, за что и была признана говнокодской)
        Ответить
        • вы наверное попутались и имеете в виду fork()?

          да и сендмэйл как бы говно не потому что форкается (на *нихах это ОК) а потому что у него конфиг файл который вошел в историю как самая большая ошибка программирования. (и нет, виндам до славы кошмаров настраивания сендмыл.сф еще далеко.)
          Ответить
          • нет) я о том, что для локальной доставки сендмейл запускает mailer, а mailer -- тот же sendmail, но с другими ключиками) вся программа -- один бинарник (хотя конечно слинкованный из кучи модулей).

            .cf файлы руками обычно не правят (хотя с ориелливской книжкой впринципе это возможно), хотя и .mc файлы не очень-то прозрачны для понимания))
            Ответить
            • [quote]нет) я о том, что для локальной доставки сендмейл запускает mailer, а mailer -- тот же sendmail, но с другими ключиками) вся программа -- один бинарник (хотя конечно слинкованный из кучи модулей).[/quote]

              это ничего не меняет. если программа уже есть в памяти, то с диска почти ничего читаться не будет - будут использоваться уже загруженые сегменты. если линух под рукой есть, сделай в шеле `cat /proc/$$/maps` для примера.
              Ответить
              • т.е. если я делаю exec(foo), и foo уже выполняется, то новый фу зашарит с работающим сегмент кода?
                Ответить
                • да. .text и .rodata шарятся. или более обобщенно: шарится (почти) все то к чему программа доступается через mmap(MAP_SHARED) c PROT_READ и/или PROT_EXEC. кернел мапит сегменты правильно, поэтому они автоматом и шарятся.
                  Ответить
                  • круто)
                    значит мысль иметь один бинарник не так уж и плоха.
                    правда это умильно выглядет при портировании
                    что-то подсказывает мне, что не все платформы ведут себя точно так же.
                    Ответить
                    • особенно если простым переименованием можно превратить zip в gzip, ага
                      Ответить
          • А ещё говорят, что он был одной из причин, из-за которых пришёл Великий Червь.
            Ответить

    Добавить комментарий