Как выполнить сценарий, который был передан по конвейеру?

I want to limit the use of swap space (not its size just the usage).

В Solaris нельзя ограничить резервирование подкачки.

Практически каждому байту ОЗУ, используемому процессом, Solaris гарантирует доступное постоянное резервное хранилище. (В Solaris есть некоторые исключения, например, некоторые типы разделяемой памяти, для которых не требуется резервирование подкачки, поскольку они не могут быть выгружены. Эти функции используются в таких реализациях, как SGA базы данных Oracle.)

Отображенные в память -файлы, такие как исполняемые файлы и общие объекты, обычно используют фактический файл на диске в качестве резервного хранилища и, таким образом, вообще не используют пространство подкачки. Для большинства других применений памяти требуется резервное хранилище. Например, если процесс запрашивает у ядра 2 ГБ кучи, но фактически никогда ее не использует, это приведет к резервированию 2 ГБ для пространства подкачки, поскольку Solaris гарантирует, что если процесс запрашивает память, он ее получит. Нет убийцы OOM, который убивает ваш процесс базы данных на вашем сервере рабочей базы данных или ваш веб-сервер на вашем онлайн-сервере, обрабатывающем заказы клиентов...

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

Работа в соответствии с парадигмой «Я сказал, что вы можете иметь эту память, и это означает, что вы сможете получить к ней доступ независимо от того, что» вместо парадигмы «Я сказал, что вы можете получить эту память память, но я солгал вам, и теперь, когда вы попытались ее использовать, я вас убью», и эта стоимость может показаться непомерным использованием подкачки.

Чтобы просмотреть использование подкачки процессом, вы можете использовать команду pmap -S:

bash-4.1$ pmap -S $$
4622:   /usr/bin/bash
         Address     Kbytes       Swap Mode Mapped File
0000000000400000       1412          - r-x----  bash
0000000000571000         40         40 rw-----  bash
000000000057B000         24         24 rw-----  bash
0000000EC09E6000        236        236 rw-----    [ heap ]
00007FF0C8590000        304          - r-x----  libcurses.so.1
00007FF0C85EC000         20         20 rw-----  libcurses.so.1
00007FF0C85F1000         16         16 rw-----  libcurses.so.1
00007FF0C8600000       6756          - r-x----  en_US.UTF-8.so.3
00007FF0C8CA9000          8          8 rw-----  en_US.UTF-8.so.3
00007FF0C8CD0000         32          - r-x----  libgen.so.1
00007FF0C8CE8000          4          4 rw-----  libgen.so.1
00007FF0C8CF0000         64         64 rwx----    [ anon ]
00007FF0C8D10000         64         64 rwx----    [ anon ]
00007FF0C8D2D000          4          - rwxs---    [ anon ]
00007FF0C8D30000         64          - r-x----  methods_unicode.so.3
00007FF0C8D40000          4          4 rw-----  methods_unicode.so.3
00007FF0C8D50000         24         24 rwx----    [ anon ]
00007FF0C8D60000       1816          - r-x----  libc.so.1
00007FF0C8F36000         68         68 rw-----  libc.so.1
00007FF0C8F47000          8          8 rw-----  libc.so.1
00007FF0C8F50000         64         64 rw-----    [ anon ]
00007FF0C8F6C000        352          - r-x----  ld.so.1
00007FF0C8FD4000         16         16 rwx----  ld.so.1
00007FF0C8FD8000          4          4 rwx----  ld.so.1
FFFF80E6271AF000         20         20 rw-----    [ stack ]
---------------- ---------- ----------
        total Kb      11424        684

Обратите внимание на эту строку:

0000000000400000       1412          - r-x----  bash

Столбец Swapуказывает, что конкретное отображение памяти вообще не требует использования подкачки. Это часть исполняемого файла bash, которая поддерживается самим файлом /usr/bin/bashна диске -.

Но эта строка:

0000000000571000         40         40 rw-----  bash

использует 40 КБ подкачки. Вероятно, это сегмент данных, сопоставленный с /usr/bin/bash, но поскольку это изменяемые данные (, обратите внимание на rwразрешения ), резервное хранилище не может быть не -изменяемым /usr/bin/bashдисковым файлом, поэтому он получает резервирование подкачки 40 КБ.

Обратите внимание, что все отображения heap, anonи stackполностью поддерживаются пространством подкачки.

Итог:

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

Или сделайте раздел подкачки большего размера.

0
04.03.2021, 19:01
1 ответ

Предварительно -исправьте поврежденный файл перед его выполнением:

#!/bin/bash
dos2unix script.py
./script.py

Для интерактивного использования используйте скрипт-оболочку, чтобы исправить файл перед его выполнением. Создайте имя файла run_broken_file.shсо следующим содержимым:

#!/bin/bash
dos2unix "$1"
"$@" 

А потом можешь бежать./run_broken_file.sh./script.py arg1 arg2 arg3

Пробный запуск:

$ unix2dos script.py 
unix2dos: converting file script.py to DOS format...

$./script.py 
/usr/bin/env: ‘python3\r’: No such file or directory

$ cat -A script.py 
#!/usr/bin/env python3^M$
import sys^M$
print(f"hello {sys.argv}")^M$

$ cat run_broken_file.sh 
#!/bin/bash
dos2unix "$1"
"$@"

$./run_broken_file.sh./script.py arg1 arg2 'arg3 with spaces'
dos2unix: converting file./script.py to Unix format...
hello ['./script.py', 'arg1', 'arg2', 'arg3 with spaces']
2
18.03.2021, 22:27

Теги

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