LINUX.ORG.RU

Как в питоне запустить subprocess в фоне?

 , ,


1

3

Python3

proc = subprocess.call(['sudo', 'screen', '-d', '-m', '-S', ovpn[:-5], 'openvpn','--route-noexec', '--config', ovpn], stdout=subprocess.PIPE)

только прячет вывод, но останавливает дальнейшее выполнение скрипта. Пробовал для такого случая screen, но после десятка запущенных сессий к следующим не могу получить доступ. Доступ нужен только на убить процесс, поэтому простой запуск в фоне пойдет.

★★★★★

Уверен, что вопрос именно в этом? Или изначально решается какая-то иная задача?

zolden ★★★★★
()
Ответ на: комментарий от zolden

Уверен. Надо запускать процесс в detached режиме. Просто делаю скрипт на запуск кучи впн. Руками ооочень долго. А в текущем варианте со 132 раза работает.

Qwentor ★★★★★
() автор топика

Проще запускать в режиме daemon'a, в случае различных ошибок или обрыва связи в конфиге просто задается скрипт, который нужно вызвать, еще можно напрямую сигналы отлавливать. Обработка вывода средствами popen, не самый лучший вариант.

anonymous
()
Ответ на: комментарий от Qwentor

Надо запускать процесс в detached режиме. Просто делаю скрипт на запуск кучи впн.

Большинство посетителей этого форума...вместо описания изначальной проблемы...начинают сходу описывать свои фантазии на тему её решения...
Уверены, что это не ваш случай?

zolden ★★★★★
()
Ответ на: комментарий от zolden

Скрипт просто запускает кучу впн и прописывает маршруты

import netifaces
import subprocess
import os
import glob
from pprint import pprint
from time import sleep, time


class cd:
	"""Context manager for changing the current working directory"""
	def __init__(self, newPath):
		self.newPath = os.path.expanduser(newPath)

	def __enter__(self):
		self.savedPath = os.getcwd()
		os.chdir(self.newPath)

	def __exit__(self, etype, value, traceback):
		os.chdir(self.savedPath)

def get_taps():
	interfaces = netifaces.interfaces()
	taps = []
	for interface in interfaces:
		if interface[:3] == 'tap':
			taps.append(interface)
	return taps



 

with cd("~/vpn"):
	ovpns = glob.glob('*.ovpn')
	print(ovpns)
	i = 0
	for ovpn in ovpns:
		print(i)
		subprocess.call(['sudo', 'screen', '-d', '-m', '-S', ovpn[:-5], 'openvpn','--route-noexec', '--config', ovpn])
		StartTime = time()
		while True:
			CurTime = time()
			if CurTime - StartTime > 7:
				subprocess.call('sudo', 'screen', '-X', '-S', ovpn[:-5], 'quit')
				break
			elif(len(get_taps()) > i):
				sleep(1)
				ip = netifaces.ifaddresses('tap'+str(i))[2][0]['addr']
				print(ovpn, " - ", ip)
				subprocess.call(['sudo', 'ip', 'rule', 'add', 'from', ip, 'lookup', 'viatap'+str(i)])
				subprocess.call(['sudo', 'ip', 'route', 'add', 'default', 'dev', 'tap'+str(i), 'table', 'viatap'+str(i)])
				i+=1
				break

Подскажешь как лучше?

Qwentor ★★★★★
() автор топика
Последнее исправление: Qwentor (всего исправлений: 3)
Ответ на: комментарий от Qwentor

А не проще для этого bash использовать? Зачем тут питон если ничего питонячего не юзается?

По теме - что-то вроде subprocess.Popen(["nohup", "foo", "bar", "baz"])//Не вчитывался что там и как вызывается в приведенном примере должно помочь.

alozovskoy ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.