niceload --noswap yourprg создан именно для такой ситуации: Он смотрит на активность свопинга:
Он не приостанавливает процесс до начала свопинга, но позволяет свопингу работать в течение 1 секунды, прежде чем действовать.
niceload --mem 1G yourprg
работает аналогично: если свободно менее 1 ГБ, youprg приостанавливается. Если свободно более 1 ГБ, yourprg возобновляется.
Команда запуска оболочки выглядит примерно так: 1234
является значением изvar
(и передается в качестве аргумента вsh -c
):
ssh $servername /usr/local/bin/pstat $1|awk 'FNR==5 {print $9}' 1234
Здесь $1
расширяется до первого аргумента оболочки, но у него его нет, поэтому он исчезает. 1234
является аргументом для awk
, который принимает его как имя входного файла, пытается открыть его и терпит неудачу.
Я предполагаю, что вместо этого вы хотите использовать значение из var
в качестве аргумента для pstat
. У вас есть два варианта :либо поместить число туда, где у вас сейчас $1
, с %s
, как вы делали выше; или используйте $1
и передайте var
в качестве аргумента оболочке, которая работает Popen
.
С%s
:
cmd=(''' ssh "$servername" /usr/local/bin/pstat '%s' | awk 'FNR==5 {print $9}' '''
% int(var))
p=subprocess.Popen(cmd, shell=True, ... )
Обратите внимание, что при этом значение переменной перебрасывается в середине команды оболочки, так что вам нужно знать, что она не содержит ничего опасного. С одинарными -кавычками только одиночные -кавычки вызовут проблемы. Поскольку у вас есть только номер, это должно быть безопасно.
С$1
:
cmd=(''' ssh "$servername" /usr/local/bin/pstat "$1" | awk 'FNR==5 {print $9}' ''')
p=subprocess.Popen([cmd, "sh", str(var)], shell=True, ... )
Здесь,мы передаем массив в качестве первого аргумента Popen
, что позволяет использовать первый элемент массива в качестве командной строки, а остальные — в качестве аргументов для оболочки. (т. е. выполняется sh
с аргументами -c
, cmdline...
, sh
и 1234
. Строка sh
переходит в $0
оболочки.)
Это безопаснее, чем предыдущее, поскольку значение переменной никогда не смешивается с кодом, выполняемым оболочкой (, но обратите внимание, что вам нужны двойные кавычки вокруг "$1"
по обычным причинам ).
Обратите внимание, что вам необходимо установить servername
в среде для того, чтобы эта переменная расширялась при запуске оболочки Popen
.