프로그램밥 라이트백그라운드에서 실행되지 않습니다. 실행 간에 큰 차이가 없음
sudo boblightd
그리고
sudo boblightd&
콘솔이 추가 입력을 차단하지 않는 문제를 해결하는 방법은 무엇입니까?
pi@raspberrypi ~/boblight/boblightd-for-raspberry-master $ sudo boblightd
Boblightd 2.0 (optimized version for raspberry) (c) 2013 Speedy1985 and Heven)
(InitLog) start of log /root/.boblight/boblightd.log
(PrintFlags) starting boblightd
(CConfig::LoadConfigFromFile) opening /etc/boblight.conf
(CConfig::CheckConfig) checking config lines
(CConfig::CheckConfig) config lines valid
(CConfig::BuildConfig) building config
(CConfig::BuildConfig) built config successfully
(main) starting devices
(CClientsHandler::Process) opening listening TcpSocket on *:19333
(CDevice::Process) ambilight: starting with output "/dev/spidev0.0"
(CDevice::Process) ambilight: setting up
(CDevice::Process) ambilight: setup succeeded
pi@raspberrypi ~/boblight/boblightd-for-raspberry-master $ sudo boblightd&
[1] 2289
pi@raspberrypi ~/boblight/boblightd-for-raspberry-master $
Boblightd 2.0 (optimized version for raspberry) (c) 2013 Speedy1985 and Heven)
(InitLog) start of log /root/.boblight/boblightd.log
(PrintFlags) starting boblightd
(CConfig::LoadConfigFromFile) opening /etc/boblight.conf
(CConfig::CheckConfig) checking config lines
(CConfig::CheckConfig) config lines valid
(CConfig::BuildConfig) building config
(CConfig::BuildConfig) built config successfully
(main) starting devices
(CClientsHandler::Process) opening listening TcpSocket on *:19333
(CDevice::Process) ambilight: starting with output "/dev/spidev0.0"
(CDevice::Process) ambilight: setting up
(CDevice::Process) ambilight: setup succeeded
답변1
백그라운드 명령이 작동 [1] 2289
하고 실제로 백그라운드에 배치되었음을 확인한 후.
그러나 명령의 출력은 리디렉션하지 않는 한 여전히 터미널로 전송됩니다. 이를 수행하는 포괄적인 방법은 다음과 같습니다.
sudo boblightd >std.txt 2>err.txt &
stdout과 stderr을 모두 동일한 파일로 이동하려면 다음을 수행하십시오.
sudo boblightd >std.txt 2>&1 &
물론 하나 또는 두 스트림의 출력에 관심이 없다면 /dev/null
파일 이름 대신에 보낼 수 있습니다.
sudo boblightd >/dev/null 2>err.txt &
(이 예는 표준 출력을 폐기하지만 문제가 발생할 경우를 대비해 stderr을 유지합니다.)
고쳐 쓰다
위의 내용은 boblightd가 무엇인지에 대한 무지에 근거한 것입니다. 다른 답변에서 데몬 모드가 있다는 것을 보았으므로 이 경우에 사용해야 합니다.
그런데 위의 내용은 sudo
비밀번호를 입력하라는 메시지가 표시되지 않고 터미널 창을 닫지 않을 것이라고 가정합니다. 전자의 경우 개인적으로 sudo bash
then을 사용하는데, 또 다른 접근 방식은 액세스가 캐시되도록 하기 위해 무해한 명령을 boblightd >std.txt 2>err.txt &
수행하는 것입니다 .sudo ls
후자의 경우 nohup
이는 건물을 떠난 후에도 계속 작동하도록 보장하는 마법의 명령입니다. sudo
실제 명령 뒤와 앞에 올 것입니다 . 예를 들어 sudo nohup boblightd >std.txt 2>err.txt &
. 또는 sudo bash
그런 nohup boblightd >std.txt 2>err.txt &
다음 exit
(루트 쉘을 그대로 둡니다).
답변2
다음과 같이 nohup 명령을 사용할 수 있다고 생각합니다.
nohup sudo boblightd &
그러면 명령 출력이 현재 디렉터리의 nohup.out 파일에 배치됩니다.
다음과 같이 screen 명령을 사용할 수도 있습니다. 먼저 화면을 만듭니다.
screen -S your-sreen-name
그런 다음 명령을 실행합니다.
sudo boblightd
화면을 저장하고 터미널로 돌아가려면 다음을 입력하세요. Ctrl+AD(무언가를 수행하려는 프롬프트가 표시되고 세션 Ctrl+A을 중지하지 않고 세션에서 분리하려면 "d"를 입력하세요.)screen
D
화면 복원:
screen -d -r your-screen-name
답변3
stdout 및 stderr을 숨기려면 기본값이 아닌 다른 위치로 리디렉션해야 합니다. @devnull의 의견은 이를 수행하는 방법을 보여줍니다. 이것이 첫 번째 단계입니다.
&
단순히 프로그램 분리를 사용하면 로그아웃할 때 프로그램이 자동으로 종료됩니다. 이것은 당신이 원하는 것이 아닐 수도 있습니다. nohup
이를 방지하려면 다음 명령을 사용해야 합니다 .
nohup sudo boblightd > boblight.out 2> boblight.err < /dev/null &
비밀번호를 요구할 sudo
수도 있습니다. 비밀번호를 얻지 못할 것이며, 모든 출력/입력이 리디렉션되기 때문에 비밀번호를 요구하는 것을 눈치채지 못할 것입니다. 어쨌든 이를 달성하기 위한 다양한 솔루션이 있습니다.
sudo
명령을 실행하기 전에sudo
비밀번호가 저장됩니다. 이것은 빠르고 더러운 방법입니다.- 을 삭제
&
하고 비밀번호를 제공한sudo
후 를 사용하여 프로세스를 백그라운드로 보냅니다 CTRL + Z. - 특정 사용자 및 실행 파일 쌍에 대해 비밀번호를 묻지 않도록 sudo를 구성할 수도 있습니다. 이는 보안상 취약점이 될 수 있으니 주의하시기 바랍니다.
답변4
이미 댓글에 답이 나와있으니까요. 실제 답변으로 설명을 제공하는 것이 더 나을 것이라고 생각합니다.
따라서 가는 방법은 다음과 같습니다. sudo boblightd > /dev/null 2>&1 &
여기에는 3가지 중요한 부분이 있습니다. 가장 중요한 것은 &
줄의 끝에 있습니다. 이로 인해 쉘은 제어권을 반환하기 전에 명령이 완료될 때까지 기다리지 않게 됩니다. 또한 키보드에서 표준 입력을 가져옵니다. 작업을 백그라운드로 둡니다.
그러나 이는 여전히 출력을 콘솔로 반환합니다. 이를 방지하기 위해 >
표준 출력을 리디렉션하는 기호( /dev/null
이 경우 리디렉션) 가 있습니다 .
이 시점에서도 get to screen 명령을 통해 출력을 얻을 수 있습니다. 이는 표준 오류가 됩니다. 마지막으로 마법이 있습니다 2>&1
. 이는 표준 오류 스트림의 출력을 표준 출력으로 리디렉션합니다.
2
1
표준 파일 설명자 에서 . -stdout, -stderr 이 0
됩니다 .stdin
1
2
필요한 경우 출력을 파일로 리디렉션할 수 있습니다.
백그라운드 작업과 상호 작용하도록 설계된 몇 가지 명령이 있습니다. jobs
그리고 fg
.
screen
필요한 경우 명령과 같은 고급 솔루션을 사용할 수도 있습니다.