이 질문에는 이미 답변이 있습니다.
- 얼마 동안 실행 된 후 프로세스 종료 3 답변
Ctrl-C
5 분 동안 특정 명령 ( 단축 가능)을 자동으로 실행 하는 쉬운 방법이 있습니까?
예를 들면 다음과 같습니다.
minute-command 5-minutes ping www.google.com
또는 자체 종료되지 않는 다른 명령.
5 분뿐만 아니라 시간 제한을 지정하고 싶습니다.
이 질문에는 이미 답변이 있습니다.
Ctrl-C
5 분 동안 특정 명령 ( 단축 가능)을 자동으로 실행 하는 쉬운 방법이 있습니까?
예를 들면 다음과 같습니다.
minute-command 5-minutes ping www.google.com
또는 자체 종료되지 않는 다른 명령.
5 분뿐만 아니라 시간 제한을 지정하고 싶습니다.
답변:
이 기능을 제공하는 두 가지 이상의 프로그램이 있습니다.
이름
timelimit
— 프로세스의 절대 실행 시간을 효과적으로 제한개요
timelimit [-pq] [-S killsig] [-s warnsig] [-T killtime] [-t warntime] command [arguments ...]
과
이름
timeout
-시간 제한으로 명령을 실행개요
timeout [OPTION] DURATION COMMAND [ARG]...
timeout [OPTION]
다음과 같이 패키지됩니다.
$ dlocate `which timeout timelimit`
timelimit: /usr/bin/timelimit
coreutils: /usr/bin/timeout
/-----------------------------+------------+----------------\
| Feature | timelimit | timeout |
+=============================+============+================+
| time to run | -t time | first argument |
+-----------------------------+------------+----------------+
| terminate signal | -s signal | -s signal |
+-----------------------------+------------+----------------+
| grace period | -T time | -k time |
+-----------------------------+------------+----------------+
| kill signal | -S signal | (note 1) |
+-----------------------------+------------+----------------+
| propagate signals | -p | (note 2) |
\-----------------------------+------------+----------------/
노트:
timeout
항상 SIGKILL
마지막 복원 신호로 사용합니다.timeout
하위 프로그램이 종료 할 때 신호와 함께 종료되는 기능이 없습니다.두 프로그램의 종료 상태는 다르지만 깔끔하게 요약하기는 어렵 기 때문에 직접 매뉴얼 페이지를 참조하십시오.
마찬가지로 timeout
기본적으로 많은 시스템에 설치되어있는 ( coreutils
, 난 당신이 사용하는 것이 좋습니다 많은 분포의 표준 패키지입니다) 당신은이 제공하는 추가 기능이 필요하지 않는 한 timelimit
.
timelimit
. 프로세스를 종료하는 방법 및 PID 및 GNU 시간 초과에 대한 자세한 정보 는 PID가 재사용되지 않았는지 확인하는 방법을 참조하십시오 .
timeout
GNU의에 포함되어 있습니다 로 coreutils , timelimit
아니다. 하나 또는 둘 모두를 설치할 수 없습니다. 두 번째로 timelimit는 주어진 신호로 주어진 시간 후에 명령을 실행하고 생성 된 프로세스를 종료 한다고보고 됩니다. "경고"신호가 먼저 전송 된 다음, 타임 아웃 후에 셧다운시 init (8) 작동 방식과 유사한 "킬"신호가 발생합니다. 심지어 중간 행동 에서도 다릅니다 .
timeout
그곳으로 갈 수 있습니다.
실제로 이것은 다음을 timeout
위한 것입니다.
TIMEOUT(1) User Commands TIMEOUT(1)
NAME
timeout - run a command with a time limit
SYNOPSIS
timeout [OPTION] DURATION COMMAND [ARG]...
timeout [OPTION]
DESCRIPTION
Start COMMAND, and kill it if still running after DURATION.
lx@lxtp:~$ dpkg -S /usr/bin/timeout
coreutils: /usr/bin/timeout
bash
없는 순수한 내장이 솔루션은 외부 실행 파일을 호출하지 않고 내장 명령 에 bash
의존하는 것으로 나타났습니다 . 결국 coreutils 가 설치되지 않은 시스템에서도 작동합니다 [ 1 ]
YourCommand & read -t 300 ; kill $! # 1st version
YourCommand & read -t 300 || kill $! # 2nd version
설명은 : 평소와 같이 당신은 백그라운드에서 명령을 보낼 때 &
의 PID는 내부 변수에 저장되고, $!
(의 현대 버전에 존재하는 dash
, csh
, bash
, tcsh
, zsh
...).
쉘들 사이에서 실제로 차이점을 만드는 것은 내장 명령 read
[ 2 ] 과 옵션의 존재 -t
입니다. 첫 번째 버전에서는 사용자가 지정된 시간 (초) 전에 입력 라인을 완료하지 않으면 명령이 종료되고 오류 반환 코드가 생성됩니다.
-t TIMEOUT TIMEOUT 초 내에 완전한 입력 행을 읽지 않으면 읽기 시간이 초과되어 실패를 반환합니다.
두 번째 버전은 첫 번째 버전으로 작동하지만을 누르면 킬링 시간 초과를 중단 할 수 있습니다 enter.
실제로 또는 연산자 는 시간 종료가 만료 될 때와 같이 명령이 리턴 코드가 0이 아닌 상태로 종료되는 경우에만 명령문을 ||
실행합니다 . 그 순간 전에을 누르면 0을 반환하고 이전 명령을 종료하지 않습니다.kill
read
enter
때 로 coreutils는 시스템에 존재하고 당신은 외부 프로그램을 호출 할 수있는 시간과 자원을 절약 할 필요가 없습니다, timeout
그리고 sleep
당신의 목표를 달성하기 위해 모두 완벽한 방법이 있습니다.
timeout
사용 timeout
은 간단합니다.
결국 -k
첫 번째 오류가 발생하면 추가 킬 신호를 보내는 옵션 도 사용할 수 있습니다 .
timeout 5m YourCommand # 3rd version
sleep
sleep
당신
과 함께 당신의 환상을 사용하거나 영감을 얻을 수 있습니다 [ 3 ] . 명령을 백그라운드 또는 포 그라운드에 둘 수 있습니다 (예 : top
일반적으로 포 그라운드에 있어야 함).
YourCommand & sleep 5m; kill $! # 4th Background
YourCommand & pid=$! ; (sleep 5m; kill $pid;) & # 5th Background
bash -c '(sleep 5m; kill $$) & exec YourCommand' # 6th Foreground
(cmdpid=$BASHPID; (sleep 5m; kill $cmdpid) & exec YourCommand) # 7th Foreground
설명
YourCommand
한 다음 셸 sleep
을 5 분 동안 실행 합니다 . 완료되면 마지막 백그라운드 프로세스 ( $!
)가 종료 됩니다. 당신은 당신의 껍질을 중지합니다.
YourCommand
해당 PID를 변수에 즉시 저장합니다 $pid
. 그런 다음 백그라운드에서 낮잠 을 5 분 동안 실행하고 그 결과로 저장된 PID를 종료시킵니다. 이 명령 그룹을 백그라운드로 보냈으므로 쉘을 중지하지 않습니다. $!
백그라운드에서 다른 프로그램을 실행 하여 값을 업데이트 할 수 있으므로 PID를 변수에 저장해야합니다 . 간단히 말해서 잘못된 프로세스 를 죽 이거나 전혀 프로세스를 수행하지 않을 위험을 피하십시오 .
$$
전경에 남아있는 명령이 실행됩니다. ()
PID를 변수 ( cmdpid
) 에 저장하고 백그라운드 실행으로 전송 된 다른 서브 쉘로 종료 한 서브 쉘 을 호출 한 다음 포 그라운드에서 YourCommand를 실행합니다.
물론 각 버전에서 필요한 킬 신호를 기본에서 극단적 kill -9
으로 전송하여 실제로 필요할 때만 사용할 수 있습니다.
참고 문헌
특정 경우, 대부분의 ping
지원 구현 -c
또는 --count
특정 횟수의 핑 후에 종료됩니다.
ping -c 300 host.example.com
더 일반적인 해결책은 다른 답변을 참조하십시오.
ping
구체적인 예를 위해 방금 제공 한 노출 OP를 얻습니다 . 그는 모든 프로그램마다 사례 별 솔루션을 원하지 않습니다.
다음과 같은 간단한 스크립트로 수행 할 수 있습니다.
#!/bin/bash
#
# $1 is the time to let the program run, and $2, $3, ... are the command itself.
#
"${@:2}" &
PID=$!
sleep "${@:1:1}"
kill -2 $PID
(아래 주석에서 Matija Nalis의 제안에 따라 신호 SIGINT = 2가 사용됨).
(흔하지 않은?) bash 표현에 대한 설명 $@:...
: 위치 매개 변수 ( $*, $@, "$*", "$@"
)는 다음과 같은 추가 사양을 인정합니다.
"${@:START:COUNT}"
즉, 모든 매개 변수 중에서 COUNT 개를 취합니다. 첫 번째 매개 변수는 시작 위치에있는 매개 변수입니다. COUNT가 생략 된 경우 START 위치부터 시작하여 끝까지 모두 가져 가십시오. $0
프로그램 이름 임을 기억하십시오 . START가 음수이면 끝부터 계산을 시작하고 COUNT 는 음수 일 수 없으므로 마지막 인수는 "${@:-1}"
입니다. 또한 항상 큰 따옴표 안에 위치 매개 변수를 포함하십시오.
$1
것은 꽤 심합니다. 또한에서 sleep "$1"
또는 무언가 할 수 있습니다 countdown
.
time=$1; shift
있으며 위치 매개 변수에 배열 슬라이스 구문이 필요하지 않습니다. 그러나 예, 훨씬 간단합니다.
ctrl-c
을 때 kill -INT
대신 시도 하는 것이 좋습니다 kill -9
(또는 -9
첫 번째 프로그램이 성공하지 못하면 최소한 몇 초 후에 시도 하십시오-프로그램이 깨끗하게 종료되고 임시 파일을 남기지 않을 수 있습니다)
ping
당신의 예에서 언급 했으므로 ; 이 명령에는 특정 시간이 지나면 중지 할 수있는 몇 가지 옵션이 있습니다.
- w 데드 라인 송신 또는 수신 된 패킷 수에 관계없이 ping이 종료 되기 전에 제한 시간을 초 단위로 지정하십시오 . 이 경우 카운트 패킷이 전송 된 후 핑 이 중지되지 않으며 , 최종 기한이 만료되거나 카운트 프로브에 응답 할 때까지 또는 네트워크의 일부 오류 알림이 표시 될 때까지 대기합니다 .
- W timeout 응답을 기다리는 시간 (초). 이 옵션은 응답이없는 경우에만 시간 초과에 영향을 미치며, 그렇지 않으면 ping 은 두 개의 RTT를 기다립니다.