lxpanel
때때로 † 와 같은 프로그램을 터미널에서 실행합니다 . 터미널이 프롬프트로 다시 돌아가지 않고 정지됩니다. Ctrl+를 눌러 C프롬프트로 돌아갈 수 있지만 이렇게 하면 가 종료됩니다 lxpanel
. 그러나 Alt+를 누르고 F2(명령을 실행하는 창이 표시됨) 실행하면 lxpanel
문제가 없습니다.
왜 이런거야? 터미널에서 명령을 실행하는 것과 Alt+를 누를 때 나타나는 실행 창에서 명령을 실행하는 것은 어떻게 다릅니 까 F2?
† 여기의 lxpanel은 단지 예일 뿐입니다. 여러 프로그램에서 이런 일을 겪었어요
답변1
기본적으로 터미널은 프로그램을 포그라운드에서 실행하므로 프로그램이 완료될 때까지 셸로 돌아가지 않습니다. 이는 표준 입력에서 읽거나 표준 출력에 쓰는 프로그램에 유용합니다. 일반적으로 많은 프로그램이 동시에 실행되는 것을 원하지 않습니다. 프로그램을 백그라운드에서 실행하려면 다음과 같이 시작할 수 있습니다.
$ lxpanel &
또는 이미 실행 중인 경우 Ctrl+를 사용하여 일시 중지 Z한 다음 실행하여 bg
백그라운드로 이동할 수 있습니다. 어느 쪽이든 새로운 쉘 프롬프트가 표시되지만 프로그램은 계속 실행 중이며 해당 출력이 터미널에 표시됩니다(따라서 입력하는 동안 팝업이 나타날 수 있음).
일부 프로그램(보통 데몬)은 시작 시 별도의 프로세스를 분기한 다음 기본 프로세스가 즉시 종료되도록 합니다. 이를 통해 쉘을 차단하지 않고 프로그램을 계속 실행할 수 있습니다.
답변2
터미널에서 프로그램을 시작하면 프로그램이 중지될 때까지 터미널이 "멈춥니다". Ctrl+를 누르면 c프로그램이 닫히고 프롬프트로 돌아갑니다. 모든 GUI 애플리케이션에서 이를 볼 수 있습니다. 예를 들어 Firefox를 사용해 보세요.
다른 방법(예: Alt+F2)을 사용하거나 메뉴를 클릭하면 프로그램이 백그라운드에서 시작되므로 이상한 일이 발생하지 않습니다(어쨌든 명령 프롬프트도 없습니다).
그래도 터미널에서 GUI 애플리케이션을 시작하려면 &
아래와 같이 명령 끝에 추가하세요.
lxpanel &
이는 터미널이 lxpanel
백그라운드에서 실행되고 즉시 다른 프롬프트가 표시되도록 지시합니다.
답변3
기본적으로 프로그램은 해당 셸의 전경에서 실행되는 셸을 통해 실행됩니다. 이로 인해 쉘은 작업을 일시 중단하고 stdin/stdout/sterr을 터미널에서 프로그램으로 전달합니다. 데스크탑 환경을 통해 실행되는 프로그램은두 갈래로 갈라진, 이를 실행하는 프로그램과 독립적으로 실행되도록 합니다. 이는 &
명령에 a를 추가하여 대부분의 쉘에서 시뮬레이션할 수 있습니다. 하지만 이렇게 하면 여전히 std*가 터미널에 연결됩니다(데몬의 stdin에서 읽는 것이 더 복잡하기는 하지만).
답변4
& 배경은 괜찮습니다. 나중에 콘솔 상호 작용이 필요한 프로그램을 제외하고는 괜찮습니다(예: "apt -y update &"는 훨씬 나중에 사용자에게 "정말 강제합니까?"라는 질문을 표시하기 때문에 중지된 상태로 끝납니다).. . .더 이상 아무도 보고 있지 않을 때).
이 구멍을 막고 터미널을 실제로 사용할 수 없게 된다는 것을 프로세스에 알리기 위해 일부 명령에 <&-를 추가하여 해당 명령을 활성 터미널에서 완전히 분리하고 STDIN이 더 이상 가능하지 않음을 알렸습니다. /bin/bash를 사용하는 경우 해당 쉘이 쉘인지 확인하십시오. 스크립트는 프롬프트를 캐스팅하는 데 사용할 수 있는 의사 터미널이 없다는 사실과 관련된 오류를 계속 기록합니다.
예를 들어:
`./runme.sh &> runme.log <&- & disown`
현재 터미널 세션에서 자신을 분리하는 마지막 방법입니다. STDOUT 및 STDERR은 모두 runme.log에 기록됩니다. 콘솔이나 셸이 일찍 종료되거나 다른 계정으로 로그아웃/su하면(runme에는 터미널 가비지가 없음) 상위 항목 덕분에 중요하지 않습니다. 하위 PID 관계가 삭제된 것을 인식하지도 못합니다.
업데이트: 그럼에도 불구하고 세마포어를 원래 부모의 이름과 연결하는 데 문제가 있으므로 이제 다음을 제안합니다.
at now <<< "(cmd1; cmd2; etc.) &> logfile.log"
물론 이메일을 통해 CRON의 출력을 받으려면 &>를 제거하거나 파일 대신 /dev/null로 모두 리디렉션하세요.