백그라운드에서 프로그램을 시작하는 방법


9

Boblight 프로그램 은 백그라운드에서 실행되지 않습니다. 실행간에 눈에 띄는 차이는 없습니다

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

8
말 :sudo boblightd > /dev/null 2>&1 &
devnull

학습 목적으로이 작업을 수행하지 않는 경우를 사용하십시오 dmenu. 간단하고 일을 꽤 잘합니다.
Nishant

답변:


22

[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가 무엇인지에 대한 지식이 없습니다. 다른 답변에서 데몬 모드가 있으므로이 경우 대신 사용해야합니다.

위의 BTW sudo는 암호를 묻지 않고 터미널 창을 닫지 않는다고 가정합니다 . 전자의 경우 개인적으로 보통 sudo bash다음을 사용 합니다 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(루트 쉘을 떠나).


또한 sudo암호를 묻는 메시지를 표시 하려고하면 백그라운드 프로세스가 STDIN을 읽을 수 없으므로 암호가 표시되지 않습니다.
Patrick

@ 패트릭 감사합니다. 나는 질문의 즉각적인 문제에 대해 방금 대답했지만 이것이 약간의 주목을 받고 있으므로 암호 프롬프트와 nohup에 대한 언급으로 업데이트되었습니다.
대런 쿡

5

다음과 같이 nohup 명령을 사용할 수 있다고 생각합니다.

nohup sudo boblightd &

그러면 명령의 출력이 현재 디렉토리의 nohup.out 파일에 저장됩니다.

또한 다음과 같은 화면 명령을 사용할 수 있습니다. 먼저 화면을 만듭니다.

screen -S your-sreen-name

그런 다음 명령을 실행하십시오.

sudo boblightd

화면을 저장하고 터미널로 돌아가려면 다음을 입력하십시오 Ctrl+AD( 입력 하려는 작업에 Ctrl+A대한 힌트이며 세션을 중단하지 않고 세션에서 "d"합니다).screenD

화면을 복원하십시오 :

screen -d -r your-screen-name

4

stdout 및 stderr을 기본값 이외의 것으로 리디렉션하여 숨길 수 있습니다. @devnull의 의견은이를 수행하는 방법을 보여줍니다. 첫 번째 단계입니다.

단순히 &프로그램을 분리 하는 데 사용 하면 로그 아웃 할 때 자동으로 종료됩니다. 아마 당신이 원하는 것이 아닙니다. nohup이를 방지 하려면 명령 을 사용해야합니다 .

nohup sudo boblightd > boblight.out 2> boblight.err < /dev/null &

참고 sudo가 어떤을받지 않습니다, 당신은 모든 출력 / 입력이 리디렉션되는대로, 하나를 묻는 데요 통지하지 않습니다 : 아마 암호를 요청합니다. 어쨌든 이것을 달성하기 위해 다른 솔루션이 있습니다.

  • sudo전에 명령을 실행하면 sudo암호가 저장됩니다. 그것은 더럽고 더러운 방법입니다.
  • 제거를 &주고, sudo다음과 배경에 과정을 보내, 암호를 CTRL + Z.
  • 이 특정 사용자 및 실행 가능 커플의 비밀번호를 묻지 않도록 sudo를 구성 할 수도 있습니다. 보안 위반 가능성이 있다는 점에 유의하십시오.…

이후에 nohup을 갖는 것이 더 낫 sudo습니까? sudo아래에서 실행할 때 어떻게 암호를 얻 nohup습니까?
Aaron Digulla

1
글쎄, 그것은 좋은 지적이다. 그렇지 않을 것이다. 여기에 여러 가지 해결책이 있습니다. sudo 명령을 실행하면 sudo가 비밀번호를 저장합니다. 그것은 더럽고 더러운 방법입니다. 또 다른 하나는 제거하는 것 &, 줄 sudo암호를 다음 배경으로 프로세스를 보내 ctrl + z. sudo이 특정 사용자 및 실행 가능 커플의 비밀번호를 요구하지 않도록 구성 할 수도 있습니다 .

(나는 이것을 대답에 추가했다.)

나는 보통을 수행 sudo bash한 다음 nohup새 쉘 내부에서 명령 을 실행합니다 .

실제로 &백그라운드를 사용하는 경우 로그 아웃시 종료 될 프로세스를 백그라운드로 사용하는 것은 올바르지 않습니다 . bash가 SIGHUP으로 죽인 경우에만 프로그램을 SIGHUP합니다. 그러나 로그 아웃해도 SIGHUP이 발생하지 않습니다. logoutCTRL + D 를 입력 하거나 사용하면 bash는 프로세스를 종료하고 종료합니다. GUI에서 터미널 에뮬레이터를 닫으면 SIGHUP이 전송됩니다.
Patrick

2

Boblightd

boblightd 의 경우 stderr에 전송 된 출력은 이미 로그 파일 (기본값은 ~ / .boblight / boblightd.log )에 캡처되므로 캡처 할 필요가 없으므로 버릴 수 있습니다. 또한 boblight는 기본적으로 포크되지 않지만 명령에 -f 를 포함시켜 수행 할 수 있습니다 .

다음을 시도해보십시오.

sudo boblightd -f >/dev/null 2>/dev/null

( 프로젝트 문서에서 자세한 내용 )

더 일반적으로

쉘에서 시작된 프로세스는 쉘이 종료 될 때 종료됩니다. Ctrl-Z포 그라운드에서 프로세스를 실행하는 동안 다른 사람들이 지적했듯이 제어는 셸로 돌아갑니다. 그러나이 시점에서 프로세스가 중지 된 상태 가됩니다. bg 명령을 다시 실행 과정을 얻을 수 있지만, 배경에 머물 필요합니다. 프로세스 ID 또는 작업 번호가 필요합니다 (일반적인 작업 번호 앞에 %가 붙어 있으므로) 두 번째 예를 사용하면

bg %1

또는

bg 2289

프로세스는 이제 백그라운드에서 실행되지만 여전히 셸에 연결되어 있습니다. disown명령을 사용하여 쉘에 대한 링크를 단절시킬 수 있으며 , 이는 nohup / sudo와의 혼동을 저장합니다. 와 마찬가지로 bg, disown단지 프로세스 ID 또는 작업 번호가 필요합니다

예 :

disown 2289

nohup명령으로 프로세스를 실행 한 것처럼 이제 쉘을 안전하게 종료 할 수 있습니다.


1

답변은 이미 댓글에 거의 나와 있기 때문에. 실제 답변으로 약간의 설명을 게시하는 것이 좋을 것 같습니다.

그래서 갈 길은 : sudo boblightd > /dev/null 2>&1 &

여기에는 3 가지 중요한 부분이 있습니다. &줄 끝에서 가장 중요 합니다. 제어권을 다시 부여하기 전에 쉘이 명령이 종료되기를 기다리지 않습니다. 또한 키보드에서 표준 입력을 가져옵니다. 작업을 배경으로 만듭니다.

그러나 이것은 여전히 ​​출력을 콘솔에 남겨 둡니다. 이를 방지하기 위해 >표준 출력을 리디렉션하는 기호가 있습니다 ( /dev/null이 경우).

이 시점에서 여전히 호출 된 명령 get to screen에서 출력을 얻을 수 있습니다. 이것은 표준 오류입니다. 마지막으로 2>&1마술이 있습니다. 표준 오류 스트림의 출력을 표준 출력으로 리디렉션합니다.

21표준 파일 기술자에서 왔습니다. 0stdin, 1- 표준 출력, 2- 표준 에러.

필요한 경우 출력을 파일로 리디렉션 할 수 있습니다.

뒤에서 작업과 상호 작용하도록 설계된 명령이 있습니다. jobs그리고 fg.

screen필요한 경우 명령 과 같은 고급 솔루션을 사용할 수도 있습니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.