запустить сон Linux в фоновом режиме из python

У меня есть скрипт python, который должен выполнять скрипт оболочки. Но он должен спать 30 секунд перед выполнением. Я хочу, чтобы скрипт спал в фоновом режиме, а затем выполнял его.

Команда оболочки должна быть такой: Если я наберу эту команду прямо в консоли, она сработает.

(sleep 30 && /root/bin/myscript.sh parameter1 parameter2) > /dev/null 2>&1

Теперь из python: (я разделил команды)

subprocess.call(['/bin/sleep', '30', '&'])
subprocess.call(['/root/bin/myscript.sh', str(dom), str(limit), '&'])

(str(dom) и str(limit) - два параметра)

Я получаю эту ошибку:

/bin/sleep: invalid time interval `&'

Почему в качестве параметра используется & вместо 30?


person Vince    schedule 19.11.2013    source источник
comment
Почему бы тебе просто не использовать time.sleep(secs)? docs.python.org/2/library/time.html#time. спать   -  person PearsonArtPhoto    schedule 19.11.2013
comment
Я хочу вернуться к консоли и не ждать 20 секунд, пока скрипт не будет выполнен.   -  person Vince    schedule 19.11.2013
comment
Вызов sleep в фоновом режиме просто заставит myscript.sh работать параллельно, а не после sleep. Множественные вызовы subprocess.call не ставят в очередь процессы, которые они запускают.   -  person chepner    schedule 19.11.2013


Ответы (4)


Ошибка заключается в том, что & передается команде /bin/sleep в качестве аргумента, тогда как вы используете его в контексте указания оболочке выполнить команду в фоновом режиме.

Если вы хотите использовать '&' или '&&', вы можете использовать os.system:

os.system('sleep 1 && echo foo && sleep 5 && echo bar')

или для запуска без блокировки (в фоновом режиме) вы можете использовать стандартный &:

os.system('sleep 1 && echo foo && sleep 5 && echo bar &')

person Simon Pinfold    schedule 19.11.2013
comment
Да, это работает :) Теперь мне нужно только реализовать параметры str(dom) и str(limit). Как os.system('sleep 20 && /root/bin/myscript.sh str(dom) str(limit) &') Конечно не как строку :D - person Vince; 19.11.2013
comment
Будьте осторожны, если вы используете ненадежные, предоставленные пользователем строки (например, с веб-сервера), так как в противном случае вы можете быть уязвимы для внедрения оболочки. - person Simon Pinfold; 19.11.2013
comment
Это внутренний сервер. А скрипт на питоне от xen ;) Пробовал с os.system('/bin/sleep 20 && /root/bin/myscript.sh %s %s &' % (str(dom), str(limit))) Ошибка: sh: Syntax error: "&" unexpected - person Vince; 19.11.2013
comment
Это странно, у меня работает &ing команда os.system. Что это за среда? - person Simon Pinfold; 19.11.2013
comment
Debian 6.0.4 с Xen. Python 2.7.2+ работает. Но с вашей типовой командой это работает. : S - person Vince; 19.11.2013
comment
Теперь это работает. Мне пришлось удалить обе переменные. Возможно, там был табулятор или пробел :/ Большое спасибо! - person Vince; 20.11.2013

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

from threading import Timer

def hello():
    print "hello, world"

t = Timer(30.0, hello)
t.start() # after 30 seconds, "hello, world" will be printed
person PearsonArtPhoto    schedule 19.11.2013
comment
Я не хочу запускать скрипт Python в фоновом режиме. Только 2 команды оболочки :) - person Vince; 19.11.2013

Как насчет

subprocess.Popen(["sh","-c","sleep 30; /root/bin/myscript.sh parameter1 parameter2"])

Вы можете построить командную строку для параметра1, параметра2, используя конкатенацию строк.

Но, как описано в ответе PearsonArtPhoto, лучше использовать поток.

person anishsane    schedule 19.11.2013

Вызов с одной строкой:

prc = subprocess.Popen('/bin/sleep 3; echo Some string', shell=True)

Обратите внимание, я удаляю &.

person Michael Kazarian    schedule 19.11.2013
comment
subprocess.Popen работать в фоновом режиме и не блокировать основной процесс Python. Смотрите обновление. - person Michael Kazarian; 19.11.2013
comment
Да, вы исправили :-) - person anishsane; 19.11.2013