2014-11-21 10 views
0

타임 스탬프를 내 쉘 스크립트에 넣고 싶습니다. 예를 들어, 한 파일을 scp로 만들고, 그 파일이 타임 아웃 내에서 오류를 통해 전송되지 않으면, 성공했을 경우 성공 메시지, 타임 아웃을 넣는 방법? 예를 들어셸 스크립트의 타임 아웃

답변

0

사용이 :

command & # start a new process in background 
pid=$(pidof command | cut -f1 -d' ') # save pid of started process 
sleep(timeout_value) # set timeout value to match your desired time to process 
pids=$(pidof command) # get all pids of running processes of this command 
if [[ $(grep "$pid" "$pids") ]]; then # if started process still running 
    echo "error" 
else 
    echo "success" 
fi 

변경 단어 명령은 실제 ​​명령하였습니다. 이것이 파이프 라인과 함께 작동하는지 확신 할 수 없으면 잠시 후에 테스트 해보고 다시 돌아올 것입니다. 다음 (제공 당신은 실행하고 사용 bash는) 할 수있는 파이프 라인 명령에 대한

:

(command | other_command | ...) & 
pid=$(pidof bash | cut -f1 -d' ') # save pid of started process 
sleep(timeout_value) # set timeout value to match your desired time to process 
pids=$(pidof bash) # get all pids of running bash processes 
if [[ $(grep "$pid" "$pids") ]]; then # if started process still running 
    echo "error" 
else 
    echo "success" 
fi 

문제

참고가이 스크립트로 거기에 더 나은 답변을하다 항상 것 전체 타임 아웃을 기다려라. 그건 네가 바라는 것이 아니 겠지.

가능한 솔루션은 여러 번 잠을하는 것입니다

가능한 해결 방법이 같은 :

for i in $(seq 1..100); do 
    sleep(timeout/100) # sample the timeout interval 
    pids=$(pidof bash) 
    if [[ $(grep -v "$pid" "$pids") ]]; then # if process no longer running 
     echo "succes" && exit 0  # process completed, success! 
    elif [[ $i -eq 100 ]]; then 
     echo "error" # at the end of our timeout 
    fi 
done 

참고 : 제한 시간이 정말 오래, 그것을 너무 최적화하려고하면 값 (100)을 변경 반복 당 타임 아웃이 너무 길지 않습니다.

1

timeout(1)을 사용하십시오. 작성, 디버그 및 유지 관리해야하는 자작 해결책보다 훨씬 낫습니다.

+0

젠장, 더 우아한 해결책이 있다는 것을 알았어 : D 나는 쉘 스크립팅에서 약간의 운동이 결코 나쁜 일은 아니지만 여기에 귀중한 교훈을 얻은 것 같아! – ShellFish

+0

운동으로, 확실히 아닙니다. 개발 시간으로 생각하지 않습니다. 일반적으로 유지 관리에 시간과 노력이 요구되는 비정상적인 코드가 발생합니다. –

+0

전적으로 귀하의 답변에 동의합니다. 나는 내가 내장 명령에 대해 몰랐다는 것을 믿을 수 없다. – ShellFish