Очевидное решение в этом случае - не задействовать оболочку :
import os
import subprocess
display = 0
log_file_path = "/tmp/selenium_log.txt"
selenium_port = 4455
selenium_folder_path = "/wherever/selenium/lies"
env = os.environ
env["DISPLAY"] = ":%d.0" % display
command = ["java",
"-server",
"-jar",
'selenium-server.jar',
"-port",
str(selenium_port)]
log = open(log_file_path, 'a')
selenium_server_process = subprocess.Popen(command,
cwd=selenium_folder_path,
stdout=log,
stderr=subprocess.STDOUT,
env=env)
Это сделает процесс напрямую Java-процессом. Имейте в виду, что он все еще может порождать процессы, не входящие в группу процессов, поэтому os.killpg может не знать об их уничтожении.
Если у вас есть причина вызвать оболочку (в приведенном выше коде ее нет, и есть несколько вещей, которые вы не можете сделать без оболочки, но предположим, что вы это делаете), вам придется заставить оболочку передать вам pid процесс начался как-то. Сделать это непросто, а скорее ситуативно.