내가 사용하는 출력은 fuser
다음과 같습니다.
$ fuser /
/: 1354rc 1362r 1370rc 1371rc 1395rc 1399rc 1403rc 1410rc 1414rc 1428r 1451rc 1458rc 1470rc 1472rc 1477rc 1480rc 1487rc 1492rc 1500rc 1504rc 1508r 1513r 1516rc 1551r 1563rc 1567rc 1569rc 1586rc 1592rc 1629r 1630r 1633r 1645r 1660r 1695rc 1712rc 1728rc 1885r 2262rc 2273r 2585r 2602r 3342r 3799r
이해는 되지만 파이프를 연결하거나 문제가 발생하면 wc
출력 nl
은 다음과 같습니다. 누구든지 이유를 말해 줄 수 있습니까?
$ fuser / | nl
/: rcrrcrcrcrcrcrcrcrrcrcrcrcrcrcrcrcrcrcrrrcrrcrcrcrcrcrrrrrrcrcrcrrcrrrrrr
1 1354 1362 1370 1371 1395 1399 1403 1410 1414 1428 1451 1458 1470 1472 1477 1480 1487 1492 1500 1504 1508 1513 1516 1551 1563 1567 1569 1586 1592 1629 1630 1633 1645 1660 1695 1712 1728 1885 2262 2273 2585 2602 3342 3799 4618
답변1
fusionr는 일부를 stdout(표준 출력)으로 보내고 일부는 표준 오류로 보냅니다.
출력은 어떻게 나누어지나요?
파이프 메커니즘은 표준 출력만 캡처합니다.
일반 퓨저
mybox $ fuser /
/: 350r 356r 357r 364r 10484rc 10485r
이제 리디렉션하여 pid가 a에 있고 파일 형식(c 또는 r)이 stderr에 있는지 확인하세요.
mybox $ fuser / > a
/: rrrrrcr
파일 'a'는 새 줄로 끝나지 않습니다.
mybox $ cat a
350 356 357 364 10484 10485mybox $
이제 둘 다 리디렉션하십시오.
mybox $ fuser / > aa 2> bb
mybox $ cat aa
350 356 357 364 10484 10485mybox $
mybox $ cat bb
/: rrrrrcr
2>
리디렉션stderr
하나의 명령으로 둘 다 전송
mybox $ fuser / > cc 2>&1
mybox $ fuser / 2>&1 | wc
1 8 71
mybox $ fuser / 2>&1 | nl
1 /: 350r 356r 357r 364r 10484rc 10485r 11761r
2>&1
"병합"stdout
및stderr
출력이 분할되는 이유는 무엇입니까?
fusionr의 주요 용도 중 하나는 마운트 지점을 "보유"하는 프로세스를 종료하는 것입니다.
위의 명령을 기반으로 파일 내용을 사용하여 모든 프로세스를 종료할 수 있습니다.
mybox $ fuser /foo/bar > a
/foo/bar: rrrrrcr
mybox $ cat a
350 356 357 364 10484 10485mybox $
mybox $ kill $(<a)
- $( ) 구문 의미: 'a' 파일의 내용
답변2
fusionr는 출력의 일부를 stdout으로 보내고 일부는 stderr로 보내도록 작성되었습니다. 이렇게 하는 데는 두 가지 이유가 있습니다.
- 이는 일치하는 모든 PID를 다른 프로세스로 파이프할 수 있음을 의미합니다.
- POSIX 표준은 다음과 같이 말합니다.
무언가를 작성하고 디버그하는 가장 쉬운 방법은 아니지만 오랫동안 지속되어 온 표준이므로 좋거나 싫거나 이렇게 출력을 보냅니다. 즉, 파이프하거나 리디렉션하면 많은 PID나 플래그 중 하나를 얻을 수 있지만 둘 다 얻을 수는 없습니다.
이러한 경우가 발생하는 이유에 대한 자세한 내용은 다음을 참조하세요.#166417