Как отправить несколько команд в одну строку в командной строке netbatch nbq

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

Кто-нибудь может подсказать, как отправить однострочную команду с помощью команды 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. Используйте приведенные методы, чтобы эффективно запустить необходимые команды и оптимизировать выполнение задач.

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

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

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