루트로 실행하고 싶지 않은 장기 실행 Bash 스크립트가 있지만 정기적으로 루트 액세스가 필요합니다. 사용자에게 루트 비밀번호를 요청하여 이 문제를 해결했습니다.
sudo -v
그런 다음 백그라운드에서 다음을 사용하여 sudo 타이머를 반복하고 재설정하는 프로세스를 실행합니다.
sudo -n true
read
그런 다음 기본 프로세스에서 사용할 때 이상한 문제가 발생하기 시작했습니다. 다음은 이 문제를 보여주는 최소한의 스크립트입니다. 실행하고 실행하기 전에 아무 것도 입력하지 않으면 sudo -n true
읽기에서read error: 0: Resource temporarily unavailable
#!/usr/bin/env bash
sudo -v # ask user for password
sleep 1 && sudo -n true & # background a process to reset sudo
printf "Reading text: "
read -n 1 TEXT
echo "Read text: $TEXT"
이 명령을 제외한 다른 명령을 사용하여 이 동작을 복제할 수 없습니다 sudo
. sudo -n true
방해하지 않고 백그라운드에서 어떻게 실행할 수 있나요 read
?
편집하다:
이 문제는 macOS가 아닌 Ubuntu에서만 발생합니다.
답변1
나는 같은 행동을 취합니다.
sleep 1 && true < /dev/tty &
read var
sudo
bash에 의한 시스템 호출이 EAGAIN으로 반환되도록 /dev/tty
하는 현재 포그라운드 프로세스 그룹을 쿼리하기 위해 엽니다 . Ubuntu 18.04의 Linux 커널 4.15.0-45-generic 및 4.18.0-14-generic은 적어도 유틸리티가 다음으로 반환되도록 합니다. 그 오류.read()
read
read
이로 인해 발생하는 것 같습니다.Linux 커널의 Ubuntu 변형 최신 버전에 있는 버그. 나는 그것을 Solaris와 FreeBSD에서 재현할 수 없으며 어떤 Linux 버전의 Debian에서도 재현할 수 없습니다(비록 우분투 4.18 커널에서 데비안을 부팅하면 재현할 수 있지만).
https://bugs.launchpad.net/ubuntu/+source/linux-signed-hwe/+bug/1815021오류의 또 다른 징후인 것 같습니다.
이는 다음으로 인해 발생합니다.https://lkml.org/lkml/2018/11/1/663우분투는 최소한 4.15 및 4.18 커널로 백포트되었습니다. 하지만 Ubuntu는 백포트되지 않습니다.또 다른 변화수리하다이 패치로 인해 발생하는 회귀~까지2시간 전.
이제 4.18.0-15-generic을 Ubuntu 리포지토리에서 사용할 수 있으며 이 문제가 해결되었습니다. 곧 4.15 버전이 나올 것 같아요.
ksh93
read
내장 함수는 먼저 select()
입력 대기를 사용하고 select()
다른 프로세스가 열려 있을 때 반환하지 않기 때문에 동일한 코드에는 문제가 없습니다 /dev/tty
.
따라서 여기서 ksh93
대신 사용하거나 bash
커널이 수정될 때까지 기다리거나 4.15.0-46이 릴리스될 때까지 4.15.0-43으로 돌아갈 수 있습니다.
zsh
또는 스크립트를 시작하면 (EUID/UID/USERNAME 특수 변수를 통해) uid 변경에 대한 내장 지원을 사용할 수 있으므로 스크립트 내에서 실행할 root
필요가 없습니다 sudo
(스크립트 수명 연장). 사용자가 예상하는 것보다 긴 sudo 토큰을 사용하면 잠재적으로 위험할 수도 있습니다).