Вопрос или проблема
Я использую 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
, но и сохранять её текст для дальнейшего анализа. Это особенно полезно для отслеживания выполнения задач и отладки. Выбор подхода зависит от ваших личных предпочтений и особенностей сценария, который вы используете.
Если вам требуется помощь с более сложными командами или проблемами, не стесняйтесь задавать дополнительные вопросы.