5

Я часто использую nohup для важных длительных процессов в linux/bash , настолько, что nohup time my command with arguments && mv nohup.out my.log для меня почти идиома.

Проблема в том, что nohup помещает как stdout и stderr в nohup.out , и я не могу контролировать имя файла. Это означает, что если я случайно запустил два nohup в одном каталоге, их выходные данные будут чередоваться в nohup.out .

Вопросы:

  1. Как мне справиться с этой проблемой? Всегда запускать nohup s в отдельных каталогах и писать функцию оболочки, которая сначала проверит наличие ./nohup.out - вот два варианта, которые я вижу.

  2. Почему я не могу сказать nohup куда перенаправить вывод? У инструментов GNU, как правило, так много вариантов, почему бы не nohup?

3 ответа3

7

Вы можете перенаправить как stdout, так и stderr в один файл. С Bash 4 (или другими, такими как Zsh), так же просто, как:

nohup <some-command> &> output.log

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

6

Чтобы добавить вывод в пользовательский файл, вы можете использовать >> в команде nohup.

nohup php your_command >> filename.out 2>&1 &

Эта команда добавит все выходные данные в ваш файл, не удаляя старые данные.

3

Есть больше способов, чем просто nohup чтобы запустить процесс, чтобы он игнорировал SIGHUP; например: (написано как функции оболочки)

nohup() {
    setsid "$@"
}

nohup() {
    ("$@" &)
}

nohup() {
    "$@" & disown
}

(setsid или даже (setsid "$@" &) , может быть лучшим выбором.)

Все они позволяют вам указать ваши собственные перенаправления с помощью > , 2> и &>/>& .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .