왜 일부 명령이 완료 될 때까지 터미널을 ‘매달려’합니까? 경우 종료됩니다 lxpanel. 그러나 Alt+ F2(명령을 표시하는

때로는 터미널에서 프로그램을 실행합니다 (예 : lxpanel†) . 터미널이 프롬프트로 다시 돌아 가지 않고 중단됩니다. Ctrl+ C를 누르면 프롬프트로 돌아갈 수 있지만이 경우 종료됩니다 lxpanel. 그러나 Alt+ F2(명령을 표시하는 창이 팝업 됨)를 누르고 실행하면 lxpanel정상적으로 작동합니다.

왜 이런거야? 터미널에서 명령을 실행하는 것과 Alt+ 를 누를 때 나타나는 ‘실행’창과 다른 점은 무엇입니까 F2?

여기서 lxpanel은 예제로 사용되었습니다. 여러 프로그램에서 이것을 경험했습니다.



답변

기본적으로 터미널은 포 그라운드에서 프로그램을 실행하므로 프로그램이 완료 될 때까지 쉘에서 다시 종료되지 않습니다. 이것은 stdin에서 읽거나 stdout에 쓰는 프로그램에 유용합니다. 일반적으로 많은 프로그램이 한 번에 실행되는 것을 원하지 않습니다. 백그라운드에서 프로그램을 실행하려면 다음과 같이 시작할 수 있습니다.

$ lxpanel &

또는 이미 실행중인 경우 Ctrl+로 일시 중단 Z한 다음 실행 bg하여 백그라운드로 이동할 수 있습니다. 어느 쪽이든 새 쉘 프롬프트로 끝나지만 프로그램은 여전히 ​​실행 중이며 출력은 터미널에 나타납니다 (따라서 입력하는 동안 갑자기 나타날 수 있습니다)

일부 프로그램 (일반적으로 데몬)은 시작할 때 별도의 프로세스를 분기 한 다음 기본 프로세스를 즉시 종료합니다. 이를 통해 쉘을 차단하지 않고 프로그램을 계속 실행할 수 있습니다.


답변

터미널에서 프로그램을 시작하면 프로그램이 중지 될 때까지 터미널이 “중지”됩니다. Ctrl+ c를 누르면 프로그램이 닫히므로 프롬프트로 돌아갑니다. 예를 들어 모든 GUI 응용 프로그램에서이를 볼 수 있습니다. 예를 들어 Firefox를 사용해보십시오.

Alt + F2와 같은 다른 방법을 사용하거나 메뉴를 클릭하면 프로그램이 백그라운드에서 시작되므로 이상한 일이 발생하지 않으며 명령 프롬프트가 없습니다.

터미널에서 GUI 앱을 계속 실행 &하려면 명령 끝에 다음과 같이 추가 하십시오.

lxpanel &

그러면 터미널 lxpanel이 백그라운드에서 실행 되고 즉시 다른 프롬프트가 표시됩니다.


답변

프로그램은 기본적으로 해당 쉘의 포 그라운드에서 실행되는 쉘을 통해 실행됩니다. 이로 인해 쉘은 작업을 중단하고 stdin / stdout / sterr를 터미널에서 프로그램으로 보냅니다. 데스크탑 환경을 통해 실행되는 프로그램은 분기 되어 실행 된 프로그램과 독립적으로 실행됩니다. 이것은 &명령에 a 를 추가하여 대부분의 쉘에서 시뮬레이트 할 수 있지만, 여전히 std *를 터미널에 연결합니다 (백그라운드 프로그램의 stdin에서 읽는 경우 더 복잡함).


답변

나중에 콘솔 상호 작용을 필요로하는 프로그램 (예 : “apt -y update &”)을 제외하고 사용자에게 “정말 힘을 내야합니까?” …. 아무도 더 이상보고 있지 않을 때).

이 구멍을 막고 프로세스가 터미널을 절대 사용할 수 없게하는 과정을 알리기 위해 <&-를 일부 명령에 추가하여 활성 터미널에서 완전히 분리하여 STDIN이 더 이상 불가능하다는 것을 알려줍니다. 그래도 사용한다면 / bin / bash가 쉘인지 확인하십시오. 스크립트는 프롬프트를 캐스트 할 의사 터미널이없는 것과 관련된 오류를 로깅합니다.

예를 들면 다음과 같습니다.

`./runme.sh &> runme.log <&- & disown`

현재 터미널 세션에서 연결을 끊는 최고의 방법입니다. STDOUT과 STDERR 모두 runme.log에 기록됩니다. 콘솔이나 셸이 더 빨리 종료되는지 또는 다른 계정으로 로그 아웃 / 실행 한 경우 (runme에서 터미널 가비지가 발생하지 않음), 부모 자식까지도 제거 할 수 없기 때문에 중요하지 않습니다. PID 관계가 제거되었습니다.

업데이트 : 그럼에도 불구하고 세마포어를 원래 부모의 이름과 연결하는 데 문제가 있었으므로 이제 대신 권장합니다.

at now <<< "(cmd1; cmd2; etc.) &> logfile.log"

물론 CRON에서 출력을 이메일로 받으려면 &>를 제거하거나 파일 대신 / dev / null로 리디렉션하십시오.


답변