Прохождение переменной Python в скрипт оболочки

niceload --noswap yourprg создан именно для такой ситуации: Он смотрит на активность свопинга:

  • Если свопинг закончился: Let process run
  • If swapping in: Пусть процесс выполняется
  • Если свопинг в и из: Приостановить процесс до прекращения свопинга и возобновить процесс после прекращения свопинга

Он не приостанавливает процесс до начала свопинга, но позволяет свопингу работать в течение 1 секунды, прежде чем действовать.

niceload --mem 1G yourprg работает аналогично: если свободно менее 1 ГБ, youprg приостанавливается. Если свободно более 1 ГБ, yourprg возобновляется.

1
10.07.2018, 20:27
1 ответ

Команда запуска оболочки выглядит примерно так: 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.

0
28.01.2020, 00:32

Теги

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