5 분 동안 명령을 실행하는 간단한 방법은 무엇입니까? [복제]


66

이 질문에는 이미 답변이 있습니다.

Ctrl-C5 분 동안 특정 명령 ( 단축 가능)을 자동으로 실행 하는 쉬운 방법이 있습니까?

예를 들면 다음과 같습니다.

minute-command 5-minutes ping www.google.com

또는 자체 종료되지 않는 다른 명령.

5 분뿐만 아니라 시간 제한을 지정하고 싶습니다.

답변:


67

이 기능을 제공하는 두 가지 이상의 프로그램이 있습니다.

이름

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)       |
\-----------------------------+------------+----------------/

노트:

  1. timeout항상 SIGKILL마지막 복원 신호로 사용합니다.
  2. timeout 하위 프로그램이 종료 할 때 신호와 함께 종료되는 기능이 없습니다.

두 프로그램의 종료 상태는 다르지만 깔끔하게 요약하기는 어렵 기 때문에 직접 매뉴얼 페이지를 참조하십시오.

마찬가지로 timeout기본적으로 많은 시스템에 설치되어있는 ( coreutils, 난 당신이 사용하는 것이 좋습니다 많은 분포의 표준 패키지입니다) 당신은이 제공하는 추가 기능이 필요하지 않는 한 timelimit.


10
왜 다른 것을 사용하지 않습니까?
Brice M. Dempsey

2
@ BriceM.Dempsey 로컬 컴퓨터에 시간 초과가 있지만 시간 제한이 없습니다 (리포지토리에서 사용 가능하더라도). 그래서, 그들 중 하나가 미리 설치되어 있다면 ... 그 외에도 메소드 서명을 보면 서로 다른 일을하고 다른 유스 케이스를 가지고 있음을 알 수 있습니다.
Benubird

의 구현은 두 개 이상 존재합니다 timelimit. 프로세스를 종료하는 방법 및 PID 및 GNU 시간 초과에 대한 자세한 정보 는 PID가 재사용되지 않았는지 확인하는 방법을 참조하십시오 .
sch

1
BriceM.Dempsey이 @ timeoutGNU의에 포함되어 있습니다 로 coreutils , timelimit아니다. 하나 또는 둘 모두를 설치할 수 없습니다. 두 번째로 timelimit는 주어진 신호로 주어진 시간 후에 명령을 실행하고 생성 된 프로세스를 종료 한다고보고 됩니다. "경고"신호가 먼저 전송 된 다음, 타임 아웃 후에 셧다운시 init (8) 작동 방식과 유사한 "킬"신호가 발생합니다. 심지어 중간 행동 에서도 다릅니다 .
Hastur

GNU coreutils는 모든 GNU / 리눅스에 사전 설치되어 있기 때문에 timeout그곳으로 갈 수 있습니다.
rexkogitans

87

실제로 이것은 다음을 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

16

coreutils가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을 반환하고 이전 명령을 종료하지 않습니다.killreadenter


Coreutils 솔루션 [ 1 ]

로 coreutils는 시스템에 존재하고 당신은 외부 프로그램을 호출 할 수있는 시간과 자원을 절약 할 필요가 없습니다, timeout그리고 sleep당신의 목표를 달성하기 위해 모두 완벽한 방법이 있습니다.

timeout사용 timeout은 간단합니다.
결국 -k첫 번째 오류가 발생하면 추가 킬 신호를 보내는 옵션 도 사용할 수 있습니다 .

timeout 5m YourCommand                                         # 3rd version 

sleepsleep당신 과 함께 당신의 환상을 사용하거나 영감을 얻을 수 있습니다 [ 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를 변수에 저장해야합니다 . 간단히 말해서 잘못된 프로세스 를 이거나 전혀 프로세스를 수행하지 않을 위험을 피하십시오 .
  • 6 번째 버전에서는을 통해 5 분 안에 자살하는 새로운 bash 쉘이라고하며 $$전경에 남아있는 명령이 실행됩니다.
  • 7 번째 버전에서는 ()PID를 변수 ( cmdpid) 에 저장하고 백그라운드 실행으로 전송 된 다른 서브 쉘로 종료 한 서브 쉘 을 호출 한 다음 포 그라운드에서 YourCommand를 실행합니다.

물론 각 버전에서 필요한 킬 신호를 기본에서 극단적 kill -9 으로 전송하여 실제로 필요할 때만 사용할 수 있습니다.

참고 문헌

  • [ 1 ] Coreutils
  • [ 2 ] 배쉬 초보자 가이드
  • [ 3 ] BashFAQ

2
"수면으로 판타지를 사용하거나 영감을 얻을 수 있습니다. [Bash FAQ 링크] +1 #thatsenoughinternetfortoday
joeytwiddle

11

특정 경우, 대부분의 ping지원 구현 -c또는 --count특정 횟수의 핑 후에 종료됩니다.

ping -c 300 host.example.com

더 일반적인 해결책은 다른 답변을 참조하십시오.


7
ping구체적인 예를 위해 방금 제공 한 노출 OP를 얻습니다 . 그는 모든 프로그램마다 사례 별 솔루션을 원하지 않습니다.
user1717828

8

다음과 같은 간단한 스크립트로 수행 할 수 있습니다.

#!/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
아마도 시간을 첫 번째 또는 마지막 인수로 사용하고 다른 모든 인수를 명령으로 실행하도록 스크립트를 설계했을 것입니다. bash 단어 분리를 허용하는 $1것은 꽤 심합니다. 또한에서 sleep "$1"또는 무언가 할 수 있습니다 countdown.
Peter Cordes

1
당신의 소원에 따라 @PeterCordes 완료.
MariusMatutiae

첫 번째 인수 시간을 사용하면을 수행 할 수 time=$1; shift있으며 위치 매개 변수에 배열 슬라이스 구문이 필요하지 않습니다. 그러나 예, 훨씬 간단합니다.
Peter Cordes

1
@PeterCordes Agreed, 그러나 당신은 내가 이것을하는 더 안전한 방법을 알고 있고 방금 게으른 지, 또는 내가 무지한지 아닌지 물어 보았습니다. lol.
MariusMatutiae

포스터가 (으)로 중단 될 수있는 프로그램에 대해 구체적으로 물었 ctrl-c을 때 kill -INT대신 시도 하는 것이 좋습니다 kill -9(또는 -9첫 번째 프로그램이 성공하지 못하면 최소한 몇 초 후에 시도 하십시오-프로그램이 깨끗하게 종료되고 임시 파일을 남기지 않을 수 있습니다)
Matija Nalis

5

ping당신의 예에서 언급 했으므로 ; 이 명령에는 특정 시간이 지나면 중지 할 수있는 몇 가지 옵션이 있습니다.

  • w 데드 라인 송신 또는 수신 된 패킷 수에 관계없이 ping이 종료 되기 전에 제한 시간을 초 단위로 지정하십시오 . 이 경우 카운트 패킷이 전송 된 후 이 중지되지 않으며 , 최종 기한이 만료되거나 카운트 프로브에 응답 할 때까지 또는 네트워크의 일부 오류 알림이 표시 될 때까지 대기합니다 .
  • W timeout 응답을 기다리는 시간 (초). 이 옵션은 응답이없는 경우에만 시간 초과에 영향을 미치며, 그렇지 않으면 ping 은 두 개의 RTT를 기다립니다.

man ping

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.