Я занимаюсь разработкой драйвера Kubernetes flexvolume, который создает устройства LVM, а также создает и монтирует файловые системы.
По некоторым причинам я иногда получаю тупики, которые, согласно документации, не должны возникать при использовании Popen.communicate ().
Traceback (most recent call last):
File "/usr/libexec/kubernetes/kubelet/plugins/volume/exec/example~lvm/lvm", line 356, in <module>
attach(cfg)
File "/usr/libexec/kubernetes/kubelet/plugins/volume/exec/example~lvm/lvm", line 231, in attach
result = _lvcreate(cfg['lv_name'], cfg['lv_size'], cfg['vg_name'])
File "/usr/libexec/kubernetes/kubelet/plugins/volume/exec/example~lvm/lvm", line 148, in _lvcreate
_out, _err = proc.communicate()
File "/usr/lib64/python2.7/subprocess.py", line 800, in communicate
return self._communicate(input)
File "/usr/lib64/python2.7/subprocess.py", line 1401, in _communicate
stdout, stderr = self._communicate_with_poll(input)
File "/usr/lib64/python2.7/subprocess.py", line 1455, in _communicate_with_poll
ready = poller.poll()
KeyboardInterrupt
Это иногда происходит во время моих вызовов lvcreate и mkfs. Установка shell = True не имеет значения.
_lv = None
_cmd = [ '/sbin/lvcreate', '--type', 'linear', '--size', lv_size, '--name', lv_name, vg_name ]
_out, _err = None, None
proc = subprocess.Popen(_cmd, shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
_out, _err = proc.communicate()
if proc.returncode != 0:
return (_lv, _err, proc.returncode)
Окружающая среда:
$ uname -a
Linux myhost.example.com 4.1.12-124.17.2.el7uek.x86_64 #2 SMP Tue Jul 17 20:28:07 PDT 2018 x86_64 x86_64 x86_64 GNU/Linux
# python -V
Python 2.7.5
Если я установлю stderr = None вместо stderr = subprocess.PIPE, я никогда не увижу эту проблему.
Спасибо за любую помощь.