Bash에서는 시간 제한이 10초로 설정됩니다.느린 명령
timeout 10 slowcommand
전화를 해야 할 경우 어떻게 같은 행동을 할 수 있는지 궁금합니다.스도달리기 위해느린 명령, 즉:
timeout 10 sudo slowcommand
이렇게 하면 시간이 제한됩니다.스도, 거기는 아니야느린 명령...sudo를 사용하여 이 작업을 수행하는 우아한 방법이 있나요?
편집 : 가정 해 봅시다정지시키다sudo로 실행할 수 없습니다.
답변1
timeout
셸이나 다른 셸의 내장/기능이 아닙니다 bash
(busybox 명령이 셸의 내장으로 간주될 수 있는 busybox sh를 고려하지 않는 한).
timeout
일반적으로 호환되지 않는 여러 구현이 존재하는 비표준 독립 실행형 유틸리티입니다( timelimit
동일한 기능을 가진 유틸리티도 존재함).
존재하다:
timeout 10 sudo slowcommand
이 유틸리티의 GNU 구현의 현재 버전(GNU coreutils에서, 다시 GNU 쉘과 다름) timeout
은 10초 내에 완료되지 않으면 SIGTERM 명령을 bash
실행 sudo slowcommand
하고 자체 프로세스 그룹에 보냅니다 .sudo
그러나 실행 중인 프로세스가 사용자 ID를 변경했으며 sudo
실행하기 위해 생성된 프로세스도 다른 uid로 실행되므로 두 프로세스가 실행 중인 프로세스와 동일한 프로세스 그룹에 있더라도 해당 프로세스에 대한 권한이 없습니다.sudo
slowcommand
timeout
timeout
이 문제를 해결하는 몇 가지 가능한 방법이 있습니다. 권한이 없는 프로세스를 실행하는 대신 커널이 신호를 보내도록 설정할 수 있습니다 timeout
. 예를 들어 다음을 보내도록 할 수 있습니다.
SIGPIPE
slowcommand
닫힌 파이프에 쓰는 경우:sudo slowcommand | timeout 10 cat
slowcommand
10초 후에 stdout에 쓰면 SIGPIPE가 전송됩니다.(여기서 ,
cat
,sudo
및 는slowcommand
모두 동일한 프로세스 그룹에서 실행되므로 ) 와 동일합니다timeout 10 sudo slowcommand | cat
.SIGXCPU
slowcommand
사용된 CPU 시간이 할당된 제한을 초과하는 경우:(ulimit -t 10; exec sudo slowcommand)
CPU 시간을 10초 사용하면
slowcommand
종료됩니다.SIGHUP 터미널이 전화를 끊고
sudo
세션 리더가 아닌 경우:timeout 10 script -qfc 'sudo slowcommand; exit' /dev/null
(여기서 스크립트를 가정
util-linux
)신호/신호 종료.
expect
// /zpty
같은 것을 사용하여 터미널을 시뮬레이션하고 10초 후에 문자를 보내script
해당 터미널의 포그라운드 프로세스 그룹에 SIGINT를 보낼 수도 있습니다.screen
^C