FAQ(FAQ)¶
이것들은 우리가 사용자로부터 받은 가장 흔한 질문이나 자주 묻는 질문들이다.이 문서는 나머지 문서를 읽는 대신 사용할 수 있는 것이 아니므로 질문에 대한 답변이 없는 경우에는 반드시 확인하시기 바랍니다.
주석
대부분의 API 예제 및 링크는 버전 2 이상용이며, 버전 1과 관련된 FAQ는 일반적으로 이렇게 표시됩니다.
내 (cd
/workon`/``export
/ 등) 호출이 작동하지 않는 것 같습니다!¶
Fabric은 셸 스크립트와 유사한 여러 작업에 사용할 수 있지만, 약간 직관적이지 않은 문제가 있습니다. run
또는 sudo
호출(또는 run
/sudo
V1)의 함수에는 자신만의 고유한 셸 세션이 있습니다.이는 명령 실행 후 Fabric이 표준 출력/오류 및 반환 코드를 안정적으로 결정하는 데 필요합니다.
불행히도 다음 코드의 동작은 가정할 수 있는 것과 다릅니다.
@task
def deploy(c):
c.run("cd /path/to/application")
c.run("./update.sh")
만약 이것이 쉘 스크립트라면, 두번째는 run
호출은 현재 작업 디렉토리에서 /path/to/application/
하지만 이 두 명령은 SSH를 통해 각각 다른 세션에서 실행되기 때문에 실제로 실행하려고 시도합니다. $HOME/update.sh
대신(원격 홈 디렉토리가 기본 작업 디렉토리이므로)
한 가지 간단한 해결 방법은 셸을 사용하여 논리적으로 조작하는 것입니다. 예를 들어, &&
는 다음과 같이 여러 표현식을 함께 링크합니다(왼쪽 실행에 오류가 없는 경우).
def deploy(c):
c.run("cd /path/to/application && ./update.sh")
주석
절대 경로를 사용하여 디렉토리 변경 사항을 완전히 건너뛸 수도 있습니다.
def deploy(c):
c.run("/path/to/application/update.sh")
그러나 이로 인해 문제가 있는 명령은 현재 작업 디렉토리를 가정할 수 없습니다!
왜 저는 가끔 err: stdin: is not a tty
그래요?¶
보다 Invoke’s FAQ 이를 위해 호출에 기반하지 않는 Fabric v1에 대해서도 답은 동일하다.
왜 내가 백그라운드에서 실행하지 못하는가? &
그래요?그것은 천을 걸어놓을 수 있다.¶
Because SSH executes a new shell session on the remote end for each invocation
of run
or sudo
(see also), backgrounded
processes may prevent the calling shell from exiting until the processes stop
running, which in turn prevents Fabric from continuing on with its own
execution.
이 문제를 해결하는 관건은 프로세스의 모든 표준 파이프가 호출 셸에서 분리되어 있는지 확인하는 것입니다. 이 작업은 여러 가지 방법으로 수행할 수 있습니다(건장한 순서로 나열됨).
수중에 있는 프로그램에 데몬 기술이 있는 경우 기존 데몬 기술을 사용합니다. 예를 들어 서버 바이너리를 직접 호출하는 대신 init 스크립트를 호출합니다.
Or leverage a process manager such as
supervisord
,upstart
orsystemd
- such tools let you define what it means to 《run》 one of your background processes, then issue init-script-like start/stop/restart/status commands. They offer many advantages over classic init scripts as well.
Use
tmux
,screen
ordtach
to fully detach the process from the running shell; these tools have the benefit of allowing you to reattach to the process later on if needed (though they are more ad-hoc thansupervisord
-like tools).에서 프로그램 실행
nohup
또는 이와 유사한 《쉘 인》 도구 - 이 방법은 대부분의 사용자의 성공에 한계가 있다는 점에 유의하십시오.
때때로 나는 암호가 아니라 비밀번호를 입력하라는 잘못된 요청을 받는다.¶
당사의 SSH 계층에 어떤 오류가 있기 때문에 Fabric은 현재 필요한 인증 유형을 항상 정확하게 감지할 수 없습니다.우리는 개인 키 암호인지 원격 서버 암호인지 입력하도록 요청받은 것에 대해 추측을 시도해야 하며, 어떤 경우에는 우리의 추측이 결국 틀렸다.
가장 일반적인 경우는 사용자(로컬 사용자)가 SSH 키 체인 에이전트를 실행 중인 것 같지만 원격 서버에서 SSH 키를 지원할 수 없다는 것입니다. 예를 들어 공개 키를 전송하지 않았거나 잘못된 사용자 이름을 사용했습니다.이 경우 Fabric은 《개인 키에 대한 암호 구문을 입력하십시오》라는 메시지가 표시되지만 입력한 텍스트는 실제로 원격 단말기로 전송되는 암호 인증입니다.
우리는 향후 버전에서 앞서 언급한 SSH 라이브러리에 기여함으로써 이 문제를 해결하고자 합니다.