시작하고 싶었지만 잊어버린 프로세스가 있었습니다. 동기적으로 실행하면 다음과 같습니다.
sudo -E lein run
이것은 무기한으로 잘 작동합니다. 비대화형입니다. 포트 80에서 웹 서버를 시작합니다. 하지만 내가 실행할 때 :
sudo -E lein run &
터미널 출력:
[4] 30236
몇 초 후:
[4] + 30236 suspended (tty input) sudo -E ../bin/lein run
내 프로세스는 포트 80에서 웹 서버를 시작해야 하지만 서버가 표시되지 않습니다.
질문: 무슨 일이 일어나고 있는지 어떻게 진단합니까? 나는 stdout과 stderr이 인쇄되지 않는다고 생각하지만 틀릴 수도 있습니다. 프로세스가 일시 중지된 이유는 무엇입니까? 비동기적으로 실행할 수 있는 lein run
다른 방법이 있나요 ?
답변1
이 sudo
명령은 tty를 통해 사용자와 대화할 수 있을 것으로 예상합니다. 백그라운드로 푸시하면 tty에 대한 독점 액세스가 필요하지만 더 이상 독점 액세스가 없기 때문에 중지됩니다. (이것은 보안 인터페이스이며 비밀번호가 필요할 수 있으며 사용자 계정에 대한 다양한 액세스 권한으로 프로그램을 실행합니다. 중요한 것은 사용자에게 독점적인 액세스 권한이 있다는 것입니다.)
프로그램을 screen
"실제" tty와 반드시 연관될 필요는 없는 가상 tty를 제공하는 아래에서 실행할 수 있습니다.
screen -md sudo -E lein run
답변2
백그라운드 프로세스가 터미널에서 데이터를 읽을 수 없습니다. 데이터를 읽으려고 하면 SIGTTIN(티엘러티유형존재하다넣어) 신호. 이 기능이 있는 이유는 여러 프로세스가 터미널에서 데이터를 읽으려고 시도하는 경우 각 문자가 기본적으로 프로세스 중 하나로 무작위로 이동하기 때문입니다. 이는 유용한 동작이 아닙니다. 따라서 포그라운드 프로세스는 입력을 받지만 백그라운드 프로세스는 입력을 받지 않습니다.
(약간 단순화했습니다. 읽어보세요.제어 터미널그리고터미널 출입통제좀 더 정확한 사양을 원하지만 위에 쓴 것보다 더 깊이 파고들어야 하는 상황은 거의 발생하지 않을 것입니다. )
sudo가 비밀번호를 묻는 메시지를 표시하기 위해 터미널에서 데이터를 읽으려고 시도하면 중단됩니다. 포그라운드에서 sudo를 실행한 다음 백그라운드로 전환해야 합니다.
일반적으로 쉘을 실행한 다음 백그라운드에서 명령을 실행하도록 지시할 수 있습니다. 예를 들어, su
다음과 같이 할 수 있습니다 su -c 'lein run &'
. 그러나 sudo 작성자는 이것이 일반적인 문제라는 것을 알고 있으므로 다음과 같은 옵션이 있습니다.-b
옵션을 다음으로 전달sudo
.
sudo -b -E lein run
마찬가지로, 비밀번호를 묻는 메시지가 표시된 후 백그라운드로 이동을 사용할 ssh
수 있습니다 . -f
이렇게 하면 백그라운드 프로세스가 더 이상 셸 작업이 되지 않습니다. 백그라운드에서 프로그램을 실행하고 잊어버리고 싶을 때 적합합니다.