Я думаю, что настоящая проблема заключается в том, что код gunicorn/arbiter.py хочет каждый раз выполнять скрипт Python с той же самой средой. Это важно, потому что скрипт Python, который вызывается, является неизвестным, и важно, чтобы он назывался точно так же каждый раз.
Я чувствую, что проблема, с которой вы столкнулись, связана с изменением среды между вызовами скрипта Python арбитром.
В http://github.com/benoitc/gunicorn/blob/master/gunicorn/arbiter.py#L85-89, мы видим, что питон исполняемый и арг хранятся арбитром в self.START_CTX.
Затем в http://github.com/benoitc/gunicorn/blob/master/gunicorn/arbiter.py#L303-305 мы видим, что execvpe вызывается с помощью sys.executable, измененных аргументов и затем os.environ.
Если os.environ изменилось где-то еще (то есть PWD переменной), то ваш исполняемый файл будет не назвать правильно (потому что вы больше не в правильной папке). Арбитр, похоже, позаботится об этой возможности, сохранив cwd в START_CTX. Итак, остается вопрос: почему вы не справляетесь с вызовом?
Я пробовал некоторый тестовый код из которых я написал следующее:
#!/usr/bin/env python
import sys
import os
def main():
"""Execute twice"""
cwd = os.getcwd()
print cwd
print sys.argv
if os.path.exists("/tmp/started.txt"):
os.unlink("/tmp/started.txt")
print "Deleted /tmp/started.txt"
print
return
args = [sys.executable] + sys.argv[:]
os.system("touch /tmp/started.txt")
print "Created /tmp/started.txt"
print
os.execvpe(sys.executable, args, os.environ)
if __name__ == '__main__':
main()
Когда я выполняю этот код из командной строки, она работает просто отлично:
[email protected]:~/Python/Test$ python selfreferential.py
/Users/guest/Python/Test
['selfreferential.py']
Created /tmp/started.txt
/Users/guest/Python/Test
['selfreferential.py']
Deleted /tmp/started.txt
[email protected]:~/Python/Test$ python ./selfreferential.py
/Users/guest/Python/Test
['./selfreferential.py']
Created /tmp/started.txt
/Users/guest/Python/Test
['./selfreferential.py']
Deleted /tmp/started.txt
[email protected]:~/Python/Test$ cd
[email protected]:~$ python Python/Test/selfreferential.py
/Users/guest
['Python/Test/selfreferential.py']
Created /tmp/started.txt
/Users/guest
['Python/Test/selfreferential.py']
Deleted /tmp/started.txt
[email protected]:~$ python /Users/guest/Python/Test/selfreferential.py
/Users/guest
['/Users/guest/Python/Test/selfreferential.py']
Created /tmp/started.txt
/Users/guest
['/Users/guest/Python/Test/selfreferential.py']
Deleted /tmp/started.txt
[email protected]:~$
Как вы можете видеть, не было никаких проблем с тем, что делал стрельба. Итак, возможно, ваша проблема имеет какое-то отношение к переменной среды. Или, может быть, это связано с тем, как ваша операционная система выполняет все.
Можно ли просто не разрешить первый случай, или обернуть скрипт в сценарий оболочки, который исправит его? – mikerobi