명령을 분리하려면 마지막에 "command &"나 "nohup command &"를 사용하고 싶은데 분리한 직후에 중지됩니다.
명령은 덜 구체적이며 입력 시 eof를 받으면 중단되므로 /dev/null을 입력으로 사용하면 종료되고 일반적으로 유효한 솔루션이 됩니다.
$ command < /dev/null > /dev/null 2>&1 &
작동 안함...
unix/linux에 /dev/null을 대체하고 빈 입력처럼 동작하지만 eof를 보낼 수 없는 다른 장치가 있습니까?
(그런데 명령은 매우 유용한 멀티캐스트 도구인 emcast입니다. 직접 패치를 시도하거나 이 목적을 위해 패치된 버전을 찾을 수도 있지만... 문제는 외부에서 해결될 수 있는 것 같습니다.)
내 질문을 더 명확하게하기 위해이 편집 내용을 추가하고 있습니다. 저는 이 2줄 C 프로그램을 만들었고 완벽하게 작동합니다. 프로그램 이름은 "donothing"입니다.
#include <unistd.h>
int main() { while (1) { sleep(10); } return 0; }
그것이 내가 찾고 있는 것입니다. 표준 출력을 열어두는 것 외에 아무 것도 하지 않는 장치/프로그램입니다. ("command & ... disown" 및 "nohup command &") 둘 다 작동합니다.
$ donothing | mycommand >/dev/null &
$ disown %1
훌륭하게 작동하므로 이제 문제는 UNIX 장치/프로그램이 "아무 것도 하지 않음"처럼 동작하는 것입니다.
답변1
명령이 를 감지하려면 eof
표준 입력에서 읽어야 합니다. 아마도 입력을 기다리고 있는 것 같습니다. 따라서 필요한 것은 빈 입력( /dev/null
정확히 이 목적을 위해)이 아니라 결코 나타나지 않는 입력인 것 같습니다.
파이프를 사용하여 시뮬레이션할 수 있으며 반대편에는 아무도 다음과 같은 내용을 작성하지 않습니다.
sleep 999999999 | the-command
또는 추가 명령을 실행하지 않으려면 sleep
명명된 파이프를 사용하여 수행할 수 있습니다.
fifo=$(mktemp -u) &&
mkfifo "$fifo" &&
(rm "$fifo" && the-command <&3 3<&- &) 3<> "$fifo"
/dev/null
중간 파일 설명자는 명령을 시작할 때 쉘이 암시적으로 stdin에 연결된다는 사실을 설명하기 위해 여기에서 사용됩니다 &
(여기서 수행한 것처럼 명시적인 stdin 리디렉션을 추가하지 않는 한 <&3
).
Linux에서는(아마도 Linux에서만) 다음을 수행할 수도 있습니다.
the-command < /dev/fd/1 3>&1 > /dev/null | :
/dev/fd/1
여기서 fd 1은 Linux에서 명명된 파이프처럼 동작하는 파이프에 연결됩니다. 즉, 읽기 모드로 열면 파이프의 읽기 끝을 얻게 됩니다.
따라서 위의 fd 0은 파이프의 읽기 끝 부분에 연결되고 다른 쪽 끝은 fd 3에 연결됩니다 the-command
. the-command
fd 3에는 아무 것도 기록되지 않으므로 fd read
0에 대한 모든 시도는 차단됩니다(또는 비차단 읽기는 반환됩니다).아직 읽을 내용이 없습니다., 또는 선택/폴링이 반환됩니다.읽을 게 없다the-command
결코 오지 않는 입력을 기다리는 것 이외의 다른 작업을 수행하는 경우 이 작업을 수행할 수 있습니다.
답변2
명령을 사용해야 합니다 disown
. 그러면 이러한 명령이 실행되는 현재 셸에서 STDIN/STDOUT이 해제됩니다.
% disown -a
-또는-
% sleep 100 &
[1] 7987
% disown %1
보다배쉬 매뉴얼 페이지더 알아보기.
disown [-ar] [-h] [jobspec ...] 옵션이 없으면 각 작업 사양이 활성 작업 목록에서 제거됩니다. -h 옵션이 주어지면 각 작업 사양은 테이블에서 제거되지 않지만 쉘이 SIGHUP을 수신할 때 SIGHUP이 작업으로 전송되지 않도록 표시됩니다. 작업 사양이 없고 -a 및 -r 옵션이 제공되지 않으면 현재 작업이 사용됩니다. jobspec이 제공되지 않은 경우 -a 옵션은 모든 작업을 삭제하거나 표시합니다. jobspec 매개변수 없이 -r 옵션은 작업을 실행 중인 작업으로 제한합니다. 작업 사양이 유효한 작업을 지정하지 않는 한 반환 값은 0입니다.
답변3
자동화된 테스트 시스템(Jenkins)에서 예상 스크립트를 실행하려면 이와 같은 것이 필요합니다. Expect가 stdin에서 EOF를 감지하면 자동으로 stdout을 닫습니다. 이로 인해 stdout에 대한 모든 쓰기가 실패하고 테스트가 종료됩니다. 나는 단순히 표준 입력을 /dev/zero로 설정하여 이 문제를 해결했습니다.
mycommand </dev/zero