как сделать, чтобы nohup записывал команды в лог сам по себе

Вопрос или проблема

Я использую nohup так:

nohup ./cmd.sh --para=abc > ${PWD}/cmd_$(date "+%Y%m%d_%H%M_%S").log 2>&1 &

Как я могу сделать так, чтобы файл лога вывода включал саму команду, т.е. часть ./cmd.sh --para=abc > ${PWD}/cmd_$(date "+%Y%m%d_%H%M_%S").log можно было найти в файле лога (например, cmd_20241030_1315_00.log).

И любой из следующих вариантов подойдёт:

nohup ./cmd.sh --para=abc > ${PWD}/cmd_$(date "+%Y%m%d_%H%M_%S").log 2>&1 &

nohup ./cmd.sh --para=abc > /real/path/cmd_20241030_1315_00.log

./cmd.sh --para=abc > /real/path/cmd_20241030_1315_00.log

./cmd.sh --para=abc

Ответ или решение

Как сделать так, чтобы лог-файл nohup содержал саму команду

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

Подход 1: Использование echo для записи команды в лог

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

# Определение команды
COMMAND="./cmd.sh --para=abc"
LOG_FILE="${PWD}/cmd_$(date "+%Y%m%d_%H%M_%S").log"

# Запись команды в лог-файл и запуск процесса
echo "$COMMAND" > "$LOG_FILE"
nohup $COMMAND >> "$LOG_FILE" 2>&1 &

В этом случае мы сначала записываем команду в лог-файл, а затем добавляем к нему выходные данные, включая ошибки. Таким образом, в лог-файле будет как сама команда, так и её вывод.

Подход 2: Объединение в одну строку

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

nohup bash -c 'echo "./cmd.sh --para=abc"; ./cmd.sh --para=abc' > "${PWD}/cmd_$(date "+%Y%m%d_%H%M_%S").log" 2>&1 &

Здесь мы используем bash -c для комплексного выполнения команд. В лог-файл сначала писать строку с командой, а затем её вывод.

Подход 3: Использование переменной для хранения команды

Если вы предпочитаете более структурированный подход, то можно зафиксировать команду в переменной, а затем выводить её в лог. Пример кода:

COMMAND="./cmd.sh --para=abc"
LOG_FILE="${PWD}/cmd_$(date "+%Y%m%d_%H%M_%S").log"

{
    echo "Command: $COMMAND"
    $COMMAND
} > "$LOG_FILE" 2>&1 &

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

Заключение

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

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

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

Капча загружается...