스레드 프로세스에서 STDIO를/dev/null로 전송하는 방법은 무엇입니까?

스레드 프로세스에서 STDIO를/dev/null로 전송하는 방법은 무엇입니까?

나는 달리려고 노력하고있다.플라리움 와인과 함께 플레이, 그런데 이상한 문제가 발생했습니다. 일반 데스크톱 항목에서 실행하려고 하면 다음 JavaScript 오류가 발생합니다.

오류 0

터미널에서 실행하면 이런 일이 발생하지 않습니다. /dev/null에 대한 파이프를 사용하더라도 처음 로그인한 후 터미널에서 Plarium Play를 먼저 실행하지 않고 데스크탑 항목에서 Plarium Play를 실행하려고 하면 두 개의 JavaScript 오류가 차례로 발생합니다.

오류 1 오류 2

두 경우 모두 제거한 후에는 물보라가 영원히 멈춥니다.

처음 명령줄에서 Plarium Play를 시작한 다음 후속 실행을 위해 수정된 데스크탑 항목(/dev/null에 대한 stdio 파이프 사용)을 사용하는 경우에는 이런 일이 발생하지 않습니다. 터미널에서 시작된 프로그램은 Ctrl+C를 누르거나 터미널을 닫아도 계속 실행되며 나중에 파이프된 데스크톱 항목을 사용하여 실행하는 것이 초기 터미널 실행보다 빠르므로 백그라운드 프로세스를 시작한다고 가정합니다. 또한 주목할 만한 점은 위의 시작 오류가 발생한 후 로그아웃하지 않고 Plarium Play를 시작하려고 하면 Plarium Play 인스턴스가 실행 중인 것으로 간주하고 즉시 종료된다는 것입니다.

터미널에서 서비스를 시작하더라도 적어도 어딘가에 일반 stdio를 파이프하도록 수정하지 않으면 데스크톱 항목에서 Plarium Play를 시작할 수 없습니다. 수정되지 않은 데스크탑 항목을 사용하려고 하면 위와 유사한 JavaScript 오류가 발생합니다.

오류 3

터미널에서 이 작업을 수행하거나 출력을 파이프하는 한 로그아웃하지 않고도 마지막 오류 이후 Plarium Play를 다시 시작할 수 있다는 점은 주목할 가치가 있습니다.

내 결론은 JavaScript와 Electron의 제한으로 인해(둘 다에 대해 거의 알지 못함) 백그라운드 서비스의 기존 인스턴스를 호출하는 프로그램의 초기 단계는 서비스 시작의 초기 단계와 마찬가지로 어딘가에서 디버깅되어야 한다는 것입니다. 문제는 서비스 시작이 물론 별도의 스레드로 전송되므로 일반 터미널의 stdio를 성공적으로 찾았음에도 불구하고 시작 명령의 일반 >pipeline이 사용되지 않는다는 것입니다. 그러나 어떤 이유로 터미널에서 실행되도록 데스크톱 파일을 구성해도 문제가 해결되지 않습니다. 성공적으로 출시되면 예상대로 Plarium Play의 Electron GUI가 표시됩니다.

이 결론이 옳다고 가정할 때(그렇지 않다고 생각하시면 알려주세요), Plarium Play가 시작되지 않도록 서버 시작 스레드에서 시도한 stdio 액세스를 /dev/null(또는 어느 곳이든)로 파이프하려면 어떻게 해야 합니까? 로그인할 때마다 먼저 명령줄에서?

답변1

데스크톱 파일을 실행하면 파일 설명자가표준 입력(0),표준 출력(1) 그리고표준 에러(3) 닫습니다. 귀하의 애플리케이션은 (적어도) 쓸 수 있을 것으로 예상합니다.표준 출력그러나 파일 설명자가 열려 있지 않기 때문에 프로그램이 중단됩니다.

해결책은 설명자를 열고 다음으로 리디렉션하는 것입니다 /dev/null.

application >/dev/null 2>&1

순서가 중요합니다. 먼저 리디렉션합니다.표준 출력, 그런 다음 설명자 2를 리디렉션합니다(표준 에러) 사본 설명자 1(표준 출력, 이제 에 첨부됨 /dev/null)

관련 정보