우아한 방법으로 영원히 아무것도 하지 않는 방법은 무엇입니까?

우아한 방법으로 영원히 아무것도 하지 않는 방법은 무엇입니까?

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를 사용한다고 가정하면 폴링이나 웨이크업이 없어야 하므로 이상하게 보이는 것 외에는 충분해야 합니다).

무한정 실행되고 stdout을 열어두지만 실제로 stdout에 아무것도 쓰지 않고 stdin이 닫힐 때 종료되지 않는 유틸리티가 필요합니다. yes실제로 stdout에 쓰는 것과 같은 것입니다 . catstdin이 닫히면 종료됩니다(또는 리디렉션하는 모든 작업이 완료됨). 나는 sleep 1000000000d효과가 있다고 생각 하지만 tail분명히 더 좋습니다. 내 데비안 상자에는 tailf명령이 약간 단축되는 가 있습니다.

다른 방법으로 프로그램을 에서 실행하는 것은 어떻습니까 screen?

답변2

sleep infinity내가 아는 가장 명확한 해결책입니다.

부동 소수점 숫자를 허용 infinity하므로 사용할 수 있습니다.sleep*, 이는소수,16진수,무한대, 또는NaN, 에 따르면 man strtod.

* 이는 POSIX 표준의 일부가 아니므로 tail -f /dev/null. 그러나 GNU coreutils(Linux) 및 BSD(Mac에서 사용됨)에서는 지원됩니다(분명히 최신 버전의 Mac에서는 지원되지 않습니다. 주석 참조).

답변3

sleep 2147483647 | program > output &

예, 2^31-1유한한 숫자이므로 실행되지 않습니다.영원히하지만 마침내 수면 시간이 끝나면 $1000를 주겠습니다. (힌트: 그때쯤이면 우리 중 한 명이 죽을 겁니다.)

  • 임시 파일이 없습니다. 확인하다.
  • 바쁘게 기다리거나 주기적으로 깨우지 않습니다. 확인하다
  • 이국적인 유틸리티가 없습니다. 확인하다.
  • 가능한 한 짧게. 좋아요, 더 짧을 수도 있어요.

답변4

다음을 사용하여 해당 작업을 수행하는 바이너리를 만들 수 있습니다.

$ echo 'main(){pause();}'| gcc -Wno-all -xc - -o pause

pause시스템 호출은 말 그대로 바쁜 대기 없이(또는 신호가 프로세스를 종료할 때까지) 아무 것도 하지 않고 다른 일의 부작용으로 수행하거나 알리지 않고 아무 것도 하지 않는 것이 유일한 목적인 하나의 시스템 호출이기 때문에 이것이 우아하다고 생각합니다 . 부모 프로세스(부모는 자식이 신호를 중지하도록 우아하게 비차단적으로 처리할 수 waitpid있으며 많은(특히 쉘)이 그렇게 합니다. 반면 신호를 발생시키지 않는 시스템 호출에서 자식이 차단될 때까지 기다리는 것은 꽤 어렵습니다.) .

관련 정보