Породите несколько процессов с единственной командой

Нет никакой опции просто возвратить одно поле. Однако опция -P гарантии, что все поля печатаются на той же строке (без этой опции, если первый столбец слишком широк, другие смещаются к следующей строке). Можно затем использовать awk для печати требуемого столбца от второй строки.

size=$(df -Pk ~ | awk 'NR==2 {print $2}')  # in kB

Для установки всех переменных сразу можно заставить awk распечатать отрывок оболочки.

eval "$(df -Pk ~ | awk 'NR==2 {printf "size=%d used=%d available=%d", $2, $3, $4}')"

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

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

block_size=$(stat -f -c %S ~)
total_blocks=$(stat -f -c %b ~)
free_blocks=$(stat -f -c %f ~)
size=$((block_size * total_blocks)) # in bytes
available=$((block_size * free_blocks))
used=$((size - available))
2
06.05.2015, 02:10
2 ответа

@dhag, конечно, имеет однострочный ответ, но синтаксис заставляет мои глаза болеть. :)

Так как вы попросили одну команду, и так как оболочка рассматривает for-do-done одну (составную) команду, я чувствую себя оправданным с этой гораздо более читабельной версией:

for i in {1..10}; do yes &; done

Обратите внимание, что некоторые оболочки автоматически nice(2) фоновые задания, так что если это проблема, то это не лучшее решение.

2
27.01.2020, 21:52

Вы совершили две ошибки:

  • В bash в объявлении переменных не должно быть мест вокруг = , поэтому объявление должно быть:

     time _ w = 1
    
  • В команде sleep time_w предполагается принимать значение переменной time _ w , т.е. «$ time _ w» , а не самой переменной:

     sleep «$ time _ w»
    
-121--155705-

Существует невероятное количество файлов, которые можно изменить, чтобы «установить бэкдор» в системе (редактирование /etc/group - самый простой, но есть много более малозаметных способов его достижения). Также можно отключить эту защиту noexec путем редактирования файла /etc/sudoers ! Я бы не стал полагаться на NOEXEC , чтобы сделать «sudo $ editor» безопасным. это небезопасно. Вместо этого DO использует sudoedit (очень тщательно, потому что множество файлов может быть использовано для получения привилегий корня!)

Кроме того, обертка sudo noexec отслеживает (медленно) движущуюся цель (см. sudo _ noexec.c история и Разница между вилкой (), vfork (), exec () и клоном () () ) Таким образом, обертка sudo _ noexec может не защитить вас в каком-либо варианте Unix и не ограничить новые системные вызовы (предполагая, что редактор использует эти новые API).

Для конкретного ответа на вопрос о LD _ PRELOAD в файле конфигурации sudo по умолчанию активируется env _ reset для выполнения команд в новой минимальной среде . Поэтому я сомневаюсь, что это можно использовать.

P.S. Я разместил аналогичный вопрос https://unix.stackexchange.com/q/200411/16640 !

-121--61226-

Можно ли принять следующие меры? Предполагается, что bash (для расширения раскосов) и GNU параллельны.

parallel -N0 -j0 -u yes ::: {1..10}

Существует настройка -j0 , чтобы убедиться, что запущено столько процессов, сколько параметров, и -u (ungroup), так что выходные данные каждого процесса печатаются, как только они доступны (это имеет значение в случае yes , так как их выходные данные бесконечны). -N0 предотвращает вставку аргументов в командную строку.

5
27.01.2020, 21:52

Теги

Похожие вопросы