Вопрос или проблема
Кто-нибудь может подсказать, как отправить однострочную команду с помощью команды nbq
? Несколько команд в Linux работают нормально, но не в режиме nbq, как ниже.
find /nfs/disks/test_dir/ -name .snapshot -prune -o -printf '%s %p\n'" | sort -nr | head -n 50 | tee log
это работает нормально в Linux, захватывая 50 лучших файлов в проверяемой области.
nbq -P <pool> -q <slot> -c <machine> -J <logfile> --task-name checkdisk find /nfs/disks/test_dir/ -name .snapshot -prune -o -printf '%s %p\n'" | sort -nr | head -n 50 | tee log
не удалось, так как она выполняет только первую часть, не распознавая конвейер.
Когда вы выполняете всю команду nbq ... find ... | sort ...
, оболочка разбивает команды следующим образом:
nbq -P <pool> -q <slot> -c <machine> -J <logfile> --task-name checkdisk find /nfs/disks/test_dir/ -name .snapshot -prune -o -printf '%s %p\n' |
sort -nr |
head -n 50 |
tee log
Таким образом, единственное, что видит nbq
, это часть перед первым конвейером. Вам нужно остановить оболочку от этого, и вместо этого передать всю строку nbq
. Без какой-либо документации о том, как nbq
разбирает и выполняет команду, трудно знать правильный подход.
-
Вы можете попросить
nbq
выполнить оболочкуsh
, с вашей оригинальной однострочной командой в качестве единственного аргумента:nbq -P <pool> -q <slot> -c <machine> -J <logfile> --task-name checkdisk \ sh -c "find /nfs/disks/test_dir/ -name .snapshot -prune -o -printf '%s %p\n' | sort -nr | head -n 50 | tee log"
-
В качестве альтернативы,
nbq
может быть достаточно умным, чтобы управлять конвейером самостоятельно (или, более вероятно, запустить другую оболочку, чтобы выполнить задачу), в этом случае вам нужно только экранировать каждый|
, чтобы защитить его от (текущей) оболочки.nbq -P <pool> -q <slot> -c <machine> -J <logfile> --task-name checkdisk \ find /nfs/disks/test_dir/ -name .snapshot -prune -o -printf '%s %p\n' \| sort -nr \| head -n 50 \| tee log
-
Если все остальные варианты не сработают, вы можете отказаться от подхода “однострочника” и поместить весь конвейер в скрипт:
#!/bin/sh find /nfs/disks/test_dir/ -name .snapshot -prune -o -printf '%s %p\n' | sort -nr | head -n 50 | tee log
затем скажите
nbq
запустить этот скрипт:nbq -P <pool> -q <slot> -c <machine> -J <logfile> --task-name checkdisk \ /path/to/top50.sh
Ответ или решение
Чтобы выполнить несколько команд в одну строку с использованием команды nbq
, необходимо учитывать, как оболочка Linux обрабатывает пайплайны и команды. Когда вы пишете команду с несколькими пайпами, оболочка автоматически разделяет её на части перед передачей в nbq
. Это означает, что только первая команда (в данном случае, find
) будет передана утилите nbq
, а остальные команды просто игнорируются.
Вот как вы можете правильно выполнить эту задачу несколькими способами:
1. Использование sh -c
Один из простых способов обойти это ограничение — передать всю команду как один аргумент через оболочку sh
. Это позволяет выполнить весь пайплайн, сохраняя его целостность:
nbq -P <pool> -q <slot> -c <machine> -J <logfile> --task-name checkdisk \
sh -c "find /nfs/disks/test_dir/ -name .snapshot -prune -o -printf '%s %p\n' | sort -nr | head -n 50 | tee log"
Этот подход гарантирует, что nbq
выполнит всю последовательность команд именно так, как вы её указали.
2. Экранирование пайпов
Если nbq
может корректно распознать пайплайн, вы можете также попробовать экранировать каждый символ пайпа с помощью обратной косой черты (\
). Это позволит оболочке правильно обрабатывать команду:
nbq -P <pool> -q <slot> -c <machine> -J <logfile> --task-name checkdisk \
find /nfs/disks/test_dir/ -name .snapshot -prune -o -printf '%s %p\n' \| sort -nr \| head -n 50 \| tee log
3. Создание отдельного скрипта
Если предыдущие методы не работают или вы просто предпочитаете более организованный код, вы можете создать скрипт. Например, создайте файл top50.sh
:
#!/bin/sh
find /nfs/disks/test_dir/ -name .snapshot -prune -o -printf '%s %p\n' |
sort -nr |
head -n 50 |
tee log
Не забудьте сделать скрипт исполняемым:
chmod +x /path/to/top50.sh
Затем просто вызовите этот скрипт с помощью nbq
:
nbq -P <pool> -q <slot> -c <machine> -J <logfile> --task-name checkdisk /path/to/top50.sh
Заключение
Эти методы предоставляют вам несколько вариантов для выполнения многокомандной операции в nbq
. Выбор подхода зависит от ваших нужд и предпочтений, а также от конфигурации вашей системы и версии nbq
. Используйте приведенные методы, чтобы эффективно запустить необходимые команды и оптимизировать выполнение задач.
Эта информация полезна для профессионалов в области информационных технологий, работающих с распределенными вычислениями и желающих повысить свою продуктивность.