2017-12-08 22 views
1

누군가 이런 일이 발생하는 이유를 설명해주십시오.-su :/dev/tty : 그런 장치 나 주소가 없습니다.

# su - someone -s /bin/bash -c "ls -la /dev/tty" 
crw-rw-rw- 1 nobody nogroup 5, 0 Dec 7 20:53 /dev/tty 
# BUT: 
# su - someone -s /bin/bash -c "echo hello > /dev/tty" 
-su: /dev/tty: No such device or address 

나는 2 개의 서비스가 내부에있는 도커 컨테이너를 구축하기 위해 3 인입니다. 이러한 서비스 A A 쉘 스크립트에 의해 startet 다음 Dockerfile withing에

CMD ["./starter.sh"] 

나는 /dev/stderr 또는 /dev/tty

# None of the following works: 
RUN ln -sf /dev/tty /var/log/thelog.log 
RUN ln -sf /dev/stdout /var/log/thelog.log 
RUN ln -sf /dev/stderr /var/log/thelog.log 

문제는 내가 서비스 중 하나를 실행하기 위해 노력하고있어 것입니다에 로그 방향을 전환 다음과 같은 오류의주지 루트 (su - someone -c "service")과 같이

unable to open log file [/var/log/thelog.log]: [6] No such device or address 

는이 문제를 어떻게 해결할 수 있을까? 로그를 /dev/*에 연결하고 루트가 아닌 사용자로 실행하려고합니다. 또한 사용자를 그룹 tty에 추가하려고 시도했으나 제대로 작동하지 않았습니다.

감사합니다.

+1

심볼릭 링크로 장치를 교체하는 것은 매우 취 약하고 위험한 것으로 보입니다. 커널은 tty를 조작합니다. 정적 파일 디스크립터가 아니기 때문에 오류가 발생합니다. – tripleee

+0

서비스를 적절한 위치에 캡처하는 서비스에 랩핑하십시오. 대부분의 정상적인 서비스는 실제로 아무 것도 콘솔에 인쇄하지 않습니다. – tripleee

+0

안녕하세요, 고마워요.하지만 그렇게하는 것은 도커와 함께하는 일반적인 관행입니다. '/ dev/*'로 리디렉션하면'docker logs mycontainer'로 로그를 볼 수 있습니다. 따라서이 문제의 핵심은 'su -'이며 다른 사용자 (! = root) 사용자로 프로세스를 시작하는 것입니다. – chevallier

답변

1

SU의 맨 는 실행 된 명령이없는 제어 단말가 없게된다는.

sudo -u someone /bin/bash -c "echo hello > /dev/tty" 

당신은/dev /에 대한 심볼릭 링크를 만들기위한 필요가 없습니다 :

$ errno ENXIO 
ENXIO 6 No such device or address 

은 sudo를가 제어 터미널을 할당 않습니다는/dev/청각 장애에 대한 모든 쓰기는 ENXIO 오류를 반환합니다 dockerfile 또는 supervisor사용자 지시문을 사용하는 경우에는 tty (/ dev/stdout 및/dev/stderr이면 충분합니다.) 또는 sudo을 사용하십시오.

+0

안녕하세요. 예, 사실 저는 관리자를 사용할 수 있으며 '사용자'에 대해 알고 있습니다. 하지만 쉘 스크립트를 사용하여 2 개의 서비스를 시작하는 방법은 감독자를 사용하지 않고 루트가 아닌 루트와 루트로 실행해야합니다. 'USER non_root'를 사용하면'RUN' 명령이 하나뿐이므로 루트 서비스를 시작할 수 없습니다. – chevallier

+0

관리자를 사용하거나 각 서비스를 다른 컨테이너에서 실행하십시오. –

+0

'supervisord '라고해도 root가 아닌 사용자로'/ dev/tty'를 사용할 수 없다는 점을 보완하고 싶습니다. – chevallier