"lein run &"백엔드에 보내면 끊깁니다
3132 단어 leiningen
묘사
실행lein run &
(또는 lein run
-호출이 백엔드로 전송됨) 및 시스템 입력이 리디렉션되지 않을 때마다 케이스 터미널은 프로그램이 시스템에서 읽든 안 읽든 Leiningen을 정지합니다.#957과 관련이 있습니다.복사하려면 linux나mac에서 다음 명령을 보내십시오 (?)시스템:
$ lein new app background-suspension
(Creating new project)
$ cd background-suspension
$ lein run &
사람들은 그것이 인쇄되기를 기대할 수도 있지만, 그것은 끊겼다.임시 해결 방안으로서 우리는
Hello, World!
할 수 있다. 프로그램 자체lein trampoline run &
처럼 이것은 신호로 인해 발생할 가능성이 높다.분명히 자바가 POSIX 신호를 정식으로 지원하지 않기 때문에, 자바가 작동할 때까지 해커 사례가 있습니다.http://www.dclausen.net/javahacks/signal.html이 문제를 처리하는 방법을 지적한 것 같다.토론 #1
네, 이'오류'의 결과와 그것이 실제로 어떻게 잘못된 것이 아니라 매우 재미있는 시스템 처리 사례를 써 보겠습니다.셸에서 백엔드 프로세스를 보낼 때마다 이 프로세스는 셸의 작업 그룹에 있고 셸은 그것을 제어할 수 있습니다.이러한 백엔드 프로세스가 stdin에서 데이터를 요청할 때마다 신호
토론 #2
를 받는다. 적어도 내가 현재 관찰한 상황을 보면 셸은 백엔드 프로세스가 다시 백엔드에 나타날 때까지 백엔드 프로세스를 멈춘다.그렇다면 우리가 스스로 포획
SIGTTIN
하고 멈추는 것을 피할 수 있을까?이것은 내가 처음에 생각한 것이지만 불행히도 상황은 그렇지 않은 것 같다.나는 사용 가능한 신호만 있으면 해커 공격을 통해 그것들을 덮을 수 있다고 시도해 보았다. 그것이 바로 HyPiRion/com이다.해피리옹.io@b55dcadd202501586e22757880b85d25eef1aadcClojure 프로그램에 문서가 없는 API를 제공합니다. (뒤에 더 많은 내용이 있습니까?)내가 한 실험에서 이곳에는 재미있는 관찰이 있었다.- 이 신호를 무시하면 일시 중지됩니다(다른 프로그램과 거의 다름없음).
- 신호 처리 프로그램에서 경고를 인쇄하면 경고가 많이 인쇄됩니다(여러 번 호출됨).주의해라, 이것은 너의 몸에 좀 위험하다.케이스가 무응답으로 바뀌기 전에 케이스에서 신속하게 실행해야 한다
SIGTTIN
.- 원자가 포획한 신호량을 계산하면 우리는 초당 약 20000개의 함정을 얻을 수 있다.
-ref와 에이전트에 대한dosyncing을 통해 stdout/stderr에 경고나 오류 메시지를 쓰려고 시도하면 자바가 실행될 때 환경segfault(!)
본질적으로 단말기 붕괴나 스팸메일을 초래하지 않고 JVM 내부에서 경고를 보내는 것을 피하는 것은 불가능할 것 같다.그러나 어떤 방식으로 케이스를 조정해서 실현할 수 있을 것 같다.나는 우리가 할 수 있기를 바란다
fg
. 그러나 샤방은 단지 하나의 논점만을 지지한다.따라서 백그라운드에서 프로그램을 실행하려면 다음 중 하나를 직접 수행해야 합니다.
-
#!/usr/bin/env bash -m
엔지니어링-
bash -c "lein run &"
유효 (stdin을 읽지 않았다면)-
lein trampoline run &
엔지니어링-
lein run <&- &
엔지니어링lein run </dev/null &
비삽입식 프로세스에서 이 프로그램을 실행하고 메모리 사용량을 줄일 수 있지만 정상적으로 작동할 수 있을 것 같습니다. (작업 원리에 대한 자세한 정보는trampoline 참조)복구가 불가능할 것 같고 손으로 복구하기 쉽다는 것을 감안하여 나는 이것을 닫을 것이다.
lein trampoline
나는 이것을 잠시 다시 열 것이다. 왜냐하면 나는 이것이 어느 곳에도 기록되어 있지 않다는 것을 깨달았기 때문이다.FAQ에 있을 것 같아서요.토론 #셋
hyPirion, 당신의 설명은 매우 도움이 되지만, stdin을 읽으려고 시도하지 않는 프로그램이 왜 SIGTTIN에 의해 막히는지 알고 싶습니다.토론 #4
@wiseman: 사실 좋은 문제예요.Leiningen이 하위 프로세스를 만들 때마다 stdio를 Lein 프로세스에서 하위 프로세스로 다시 지정해야 합니다.이것은 입력이 실제로 stdin에서 얻을 수 있다는 것을 어떤 방식으로 감지해야 한다는 것을 의미한다. 솔직히 말하면 이것은 JVM에서 거의 불가능하다.따라서, Lein 프로세스는 stdin에서 읽는 것을 막고, 셸이 백엔드로 전송되면 stdin은sigtin을 터치합니다.보다http://hypirion.com/musings/how-to-cancel-a-blocking-read이 난장판에 대한 나의 장편대론
토론 #5
에 대해 아마도 JDK7로 이 문제를 해결할 수 있을 것이다.편집: 1.7을 사용하면 우리는 ProcessBuilder/inheritIO를 사용할 수 있다. 나는 이것이 전체com을 생성할 것이라고 믿는다.해피리옹.IO 라이브러리는 필요 없습니다.
Reference
이 문제에 관하여("lein run &"백엔드에 보내면 끊깁니다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://github.com/technomancy/leiningen/issues/1173텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)