Как полностью отсоединить процесс

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

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

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

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

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

Нижняя строка: не беспокойте восходящих специалистов по обслуживанию, если это не проблема с их кодом, или специалист по обслуживанию распределения абсолютно безразличен.

5
24.01.2016, 10:09
3 ответа

Это немного сложно диагностировать, поскольку вы не указываете источник для myproc , но я подозреваю, что ваша проблема как-то связана с " контролем TTY ". Я написал небольшой сценарий оболочки, который просто вызывает sleep 100 . Я запустил его под nohup :

$ nohup ./sleeper > sleeper.out &

[1] 25305
-bash-3.2$ jobs
[1]+  Running                 nohup ./sleeper > sleeper.out &
-bash-3.2$ ps -l -p 25305
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
0 S 429624 25305 18252  0 77   0 - 15961 wait   pts/0    00:00:00 sleeper

Если вы посмотрите на вывод ps , вы увидите столбец с именем « TTY ». По крайней мере, некоторые версии nohup (та, которую я использовал выше, взята из GNU coreutils версии 5.97, поэтому она относительно старая). Когда я вышел из оболочки bash, из которой я запустил спящий , столбец TTY изменился на '?', Что означает, что у спящего его не было.

Если myproc сознательно не отключается от своего управляющего TTY, все еще возможно получить такие вещи, как сигнал SIGPIPE, если он попытается записать в стандартный вывод. Мне кажется, возможно и другое, но я не могу вспомнить или погуглить что-нибудь.

Если вы можете найти или скомпилировать " daemonize ", вы можете попробовать его. Если myproc скомпилирован, вы можете изменить исходный код для вызова библиотечной функции daemon (3) .

3
27.01.2020, 20:38

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

Обычно я бы разделил настройки на две категории:

Пользовательские настройки

Это настройки, подобные упомянутой компоновке моих панелей , они специфичны для вашего пользователя и обычно должны храниться в /home/< имя _ пользователя > .

Если вы резервируете содержимое /home/< имя _ пользователя > , а затем восстанавливаете его в новой установке, все пользовательские настройки также должны быть восстановлены. Важно, что версии программного обеспечения в новой системе не старше версии программного обеспечения в старой системе, иначе они не смогут понять ваши конфигурации из-за того, что их формат слишком новый.

Системные настройки

Эти настройки не являются специфичными для пользователя, они применяются ко всей системе. Различные сервисы имеют свои настройки в различных местоположениях, но большинство из них, которые соответствуют стандартам LSB , должны находиться в каталоге /etc .

Это может привести к проблемам при копировании всего каталога /etc в новую систему, особенно если версии программного обеспечения в новой системе не совпадают с версиями в старой.

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

Общие рекомендации

Для того, чтобы сэкономить как можно больше хлопот, я бы рекомендовал сначала установить на новую систему ту же самую версию программного обеспечения, что и на старой (только 64-битную), чтобы убедиться, что файлы конфигурации по-прежнему совместимы. После этого можно обновить его до последних версий. Таким образом, по-прежнему выполняются все процедуры модернизации файлов конфигурации.

-121--173917-

diff может быть не самым подходящим инструментом для этого. Я бы попытался написать простой сценарий, который делает именно то, что ты хочешь.

Все в памяти

Это очень простое и универсальное решение. Загружает два файла в минималистские структуры памяти, вычитает записи subset.txt из записей all.txt и записывает остаток.

#!/usr/bin/env python

with open('diff.txt', 'w') as diff:

    for record in set(open('all.txt', 'r')) - set(open('subset.txt', 'r')):
        diff.write(record)

Сохраните его в таком файле, как create _ diff.py , затем chmod + x create_diff.py и запустите его в каталоге, где находятся ваши два файла.

Только подмножество в памяти

Если требуется дальнейшая оптимизация для меньшего объема памяти, это также можно сделать без загрузки всех файлов в память, особенно all.txt не требует полной загрузки в память, а может быть просто повторен один раз.

#!/usr/bin/env python

subset_txt = open('subset.txt', 'r')
subset = subset_txt.readlines()
subset_txt.close()

with open('diff.txt', 'w') as diff_txt:
    with open('all.txt', 'r') as all_txt:
        for line in all_txt:
            if line not in subset:
                diff_txt.write(line)

На основе ввода-вывода

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

#!/usr/bin/env python

diff_txt = open('diff.txt', 'w')

with open('all.txt', 'r') as all_txt:
    with open('subset.txt', 'r') as subset_txt:
        for all_line in all_txt:
            found = False

            for sub_line in subset_txt:
                if all_line == sub_line:
                    found = True
                    break

            if found is False:
                diff_txt.write(all_line)
                subset_txt.seek(0)

diff_txt.close()

Только для отсортированных файлов без дубликатов < - рекомендуется в вашем случае

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

#!/usr/bin/env python

diff_txt = open('diff.txt', 'w')

with open('all.txt', 'r') as all_txt:
    with open('subset.txt', 'r') as subset_txt:
        subset_line = subset_txt.readline()

        for all_line in all_txt:
            if all_line == subset_line:
                subset_line = subset_txt.readline()
            else:
                diff_txt.write(all_line)

diff_txt.close()
-121--75698-

Для этого можно использовать в .

Утилита на должна считывать команды из стандартных входных данных и группировать их как на рабочем месте , которые должны быть выполнены позже.

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

echo myproc | at now

... будет работать, хотя в некоторых системах сначала необходимо настроить на мониторе демона.

2
27.01.2020, 20:38

Для полного отсоединения процесса:

nohup ./command &

stdout и stderr будут записаны в файл с именем nohup.out, расположенный в том же каталоге, где был выполнен nohup.

Если вы хотите выполнить отсоединенную команду, имея возможность видеть вывод в терминале, используйте tail:

TEMP_LOG_FILE=tmp.log
> "$TEMP_LOG_FILE"
nohup ./command &> "$TEMP_LOG_FILE" & tail -f "$TEMP_LOG_FILE" &
1
27.01.2020, 20:38

Теги

Похожие вопросы