Как запустить ulimit в сценарии с другим приложением

Вы можете использовать произвольную команду, например ls , чтобы проверить файлы и удалить их в одной строке

ls /tmp/bbsnode{1,2,3,4} &>/dev/null && rm /tmp/bbsnode{1,2,3,4}

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

Краткое объяснение:

Возвращаемое значение ls не равно нулю, если один из файлов не существует. {1,2,3,4} - это расширение скобок: оно расширяется до строки для каждого числа: поэтому / tmp / bbsnode {1,2,3,4} является то же, что и / tmp / bbsnode1 / tmp / bbsnode2 / tmp / bbsnode3 / tmp / bbsnode4 . && выполняет следующую команду, только если предыдущая команда имеет нулевое возвращаемое значение, и поэтому здесь rm выполняется, только если все 4 файла существуют. Наконец, &> / dev / null подавляет вывод ls ( &> перенаправляет как stdout , так и stderr , / dev / null избавляется от него).

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

set -- /tmp/bbsnode{1,2,3,4}
(for f; do test -f "$f" || exit; done) && rm -- "$@"
2
18.07.2017, 12:38
2 ответа

Это можно сделать тремя способами.

Используйте правильную цепочку команд загрузки -.

Вместо использования оболочки, встроенной -в команду ulimit, используйте команды, разработанные для этой цели, из различных наборов инструментов семейства daemontools -:

Таким образом, можно запустить, используя softlimitиз набора инструментов nosh в качестве примера:

gnome-terminal -t A --tab -e "softlimit --coresize unlimited./app1"

Использовать подоболочку внутри скрипта.

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

(ulimit -c unlimited ; urxvt -e "./app1")

Обратите внимание, что это не будет работать с терминалом GNOME или клиентским -серверным вариантом Unicode RXVT . Оба они не вызывают напрямую эмулятор терминала как дочерний элемент вашего скрипта. Они выполняют удаленный вызов через серверный процесс, который не будет иметь ограничений ресурсов, установленных в вашем сценарии, и не получит их.

Заставить терминал GNOME запускать оболочку, которая работает ulimit.

Помните, что вы должны строить это снизу вверх.

  1. Вы хотите, чтобы реальная оболочка выполняла работу по запуску списка команд
    ulimit -c unlimited ; exec "./app1"
  2. Чтобы передать этот список команд в sh, он должен быть одним аргументом после -c, поэтому его необходимо заключить в кавычки:
    sh -c "ulimit -c unlimited ; exec \"./app1\""
  3. Чтобы передать вызов shтерминалу GNOME, он также должен быть одним аргументом после -e,поэтому необходимо применить второй уровень цитирования:
    gnome-terminal -e 'sh -c "ulimit -c unlimited ; exec \"./app1\""'
2
27.01.2020, 22:09

ulimit -cне даст вам жесткого ограничения, оно даст вам мягкое ограничение. Жесткий лимит может быть изменен только суперпользователем, а мягкий лимит может быть изменен кем угодно. Изменение мягкого ограничения повлияет только на этот процесс.

В MacOS:

$ charlie on macbook in ~
❯❯ ulimit -aS
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
file size               (blocks, -f) unlimited
max locked memory       (kbytes, -l) unlimited
max memory size         (kbytes, -m) unlimited
open files                      (-n) 7168
pipe size            (512 bytes, -p) 1
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 709
virtual memory          (kbytes, -v) unlimited

$ charlie on macbook in ~
❯❯ ulimit -aH
core file size          (blocks, -c) unlimited
data seg size           (kbytes, -d) unlimited
file size               (blocks, -f) unlimited
max locked memory       (kbytes, -l) unlimited
max memory size         (kbytes, -m) unlimited
open files                      (-n) unlimited
pipe size            (512 bytes, -p) 1
stack size              (kbytes, -s) 65532
cpu time               (seconds, -t) unlimited
max user processes              (-u) 1064
virtual memory          (kbytes, -v) unlimited

В вашем случае жесткое ограничение, скорее всего, не ограничено, а мягкое ограничение по умолчанию равно 0. Вы можете изменить мягкое ограничение в этом процессе либо с помощью ulimit, либо непосредственно отредактировав файл /proc/FD/limits.

0
27.01.2020, 22:09

Теги

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