stdout
나는 유용한 정보를 생성 하고 그로부터 정보를 읽는 프로그램을 가지고 있습니다 stdin
. 표준 입력에 아무것도 제공하지 않고 표준 출력을 파일로 리디렉션하고 싶습니다. 지금까지는 매우 훌륭했습니다. 할 수 있습니다.
program > output
그리고 tty에서는 아무것도 하지 마세요.
그런데 문제는 이 작업을 백그라운드에서 수행하고 싶다는 것입니다. 만약 내가한다면:
program > output &
프로그램이 일시중단됩니다("일시중단(tty 입력)").
만약 내가한다면:
program < /dev/null > output &
프로그램은 EOF에 도달하므로 즉시 종료됩니다.
program
내가 필요한 것은 아무것도 하지 않고 불확정한 시간 동안 읽지 않는 무언가를 파이프로 연결하는 것 같습니다 stdin
. 다음 방법이 유효합니다.
while true; do sleep 100; done | program > output &
mkfifo fifo && cat fifo | program > output &
tail -f /dev/null | program > output &
그러나 그것은 모두 매우 추악합니다. 거기가지다표준 Unix 유틸리티를 사용하여 "무한히 아무것도 하지 않는"(다른 표현으로) 우아한 방법입니다 man true
. 어떻게 해야 하나요? (여기서 우아함에 대한 나의 주요 기준은 임시 파일 없음, 바쁜 대기 또는 주기적인 깨우기 없음, 이국적인 유틸리티 없음, 가능한 한 짧음입니다.)
답변1
내 생각엔 네가 이보다 더 나아질 것 같지는 않아
tail -f /dev/null
당신은 그것을 제안했습니다 (이것이 내부적으로 inotify를 사용한다고 가정하면 폴링이나 깨우기가 없어야하므로 이상해 보이는 것 외에는 충분할 것입니다).
당신은 무한정 실행되고, 표준 출력을 열어두지만 실제로는 표준 출력에 아무 것도 쓰지 않고, 표준 입력이 닫힐 때 종료되지 않는 유틸리티를 원합니다. 이와 유사한 것이 yes
실제로 표준 출력에 기록됩니다. cat
표준 입력이 닫히면(또는 리디렉션된 내용이 완료되면) 종료됩니다. 나는 sleep 1000000000d
그것이 효과가 있다고 생각 하지만 tail
분명히 더 좋습니다. 내 데비안 상자에는 tailf
명령을 약간 단축하는 명령이 있습니다.
다른 전략을 취하고 프로그램을 실행하는 것은 어떻습니까 screen
?
답변2
sleep infinity
내가 아는 가장 명확한 해결책입니다.
수레가 허용되므로 사용할 수 있습니다 infinity
.sleep
*,이건 아마도소수,16진수,끝없는, 또는남쪽, 에 따르면 man strtod
.
* 이는 POSIX 표준의 일부가 아니므로 tail -f /dev/null
.
답변3
sleep 2147483647 | program > output &
네, 2^31-1
수량이 한정되어 있어 실행되지 않습니다영원히, 하지만 마침내 수면 시간이 끝나면 1,000달러를 드리겠습니다. (힌트: 그때쯤이면 우리 중 한 명이 죽을 겁니다.)
- 임시 파일 보기가 없습니다.
- 바쁘게 기다리거나 주기적으로 깨어나는 일이 없습니다.
- 외부 유틸리티는 없습니다.
- 가능한 한 짧게. 좋아요, 조금 더 짧을 수도 있어요.
답변4
이 작업을 수행하는 바이너리를 만들 수 있습니다.
$ echo 'main(){pause();}'| gcc -Wno-all -xc - -o pause
pause
시스템 호출은 실제로 바쁜 대기 없이, 다른 작업의 부작용으로 수행하거나 상위 프로세스에 알리지 않고 아무것도 수행하지 않는(또는 신호가 프로세스를 종료할 때까지) 아무것도 수행하지 않는 것이 유일한 목적인 시스템 호출이기 때문에 이것이 우아하다고 생각 합니다. (상위 프로세스는 하위 프로세스가 신호를 내보내는 것을 우아하고 비차단적으로 방지할 수 있으며 waitpid
, 많은(특히 쉘)이 이를 수행하는 반면, 신호가 발생하지 않은 시스템 호출에서 하위 프로세스가 차단될 때까지 기다리는 것은 다소 어렵습니다.)