2026.07.01 | youres | 68次围观
鍓嶈█
鐢▁args鍋氬苟琛屾壒閲忓鐞嗘椂锛屾渶澶寸柤鐨勪笉鏄换鍔″け璐ワ紝鑰屾槸浠诲姟鍗℃鍦╰imeout涓?/strong>鈥斺€旇繘绋嬫棤澹版棤鎭湴娑堝け锛屼綘鍗磋繛閲嶈瘯鐨勬満浼氶兘娌℃湁銆傛湰鏂囩敤3涓畬鏁寸殑瀹炴垬鑴氭湰锛屽甫浣犱粠闆舵惌寤轰竴濂?strong>xargs timeout閲嶈瘯鏈哄埗锛岃姣忎竴涓壒閲忎换鍔¢兘鑳藉湪瓒呮椂鍚庤嚜鍔ㄦ仮澶嶃€?/p>
涓€銆佷负浠€涔坸args骞惰浠诲姟闇€瑕乼imeout閲嶈瘯鏈哄埗
xargs -P 骞惰鍚姩瀛愯繘绋嬫椂锛屽鏋滄煇涓瓙杩涚▼鍥犱负缃戠粶瓒呮椂銆佽祫婧愮珵浜夋垨閫昏緫姝婚攣鑰屽崱浣忥紝xargs 鏈韩骞朵笉浼氫富鍔ㄦ竻鐞嗗畠銆傜粨鏋滃氨鏄細
- 骞惰妲戒綅琚崰婊★紝鍚庣画浠诲姟鏃犳硶鍚姩
- CPU鍜屽唴瀛樿鍍靛案杩涚▼鎮勬倓鍚冩帀
- 鏁翠釜鎵归噺浠诲姟 silently hangs锛屼綘鍙兘鎵嬪姩
kill
鏍稿績瑙f硶锛氱敤 timeout 鍛戒护缁欐瘡涓瓙杩涚▼璁句竴涓?strong>纭秴鏃朵笂闄?/strong>锛屽啀鐢ㄩ€€鍑虹爜鍒ゆ柇鏄惁闇€瑕侀噸璇曘€?/p>
浜屻€乼imeout鍛戒护涓巟args鐨勯厤鍚堝師鐞?/h2>
2.1 timeout鐨勫熀纭€鐢ㄦ硶
timeout [閫夐」] 鏃堕暱 鍛戒护 [鍙傛暟]...
timeout [閫夐」] 鏃堕暱 鍛戒护 [鍙傛暟]...鍏抽敭鍙傛暟锛?/p>
--signal=SIGTERM锛堥粯璁わ級锛氳秴鏃跺悗鍏堝彂SIGTERM锛屽瓙杩涚▼鍙崟鑾峰仛娓呯悊--kill-after=5s锛氬鏋淪IGTERM鍚庤繘绋嬭繕娲荤潃锛?绉掑悗鍙慡IGKILL寮哄埗鏀跺壊-- foreground锛氬湪鍓嶅彴杩愯锛坸args鍦烘櫙涓嬪父鐢級
2.2 timeout鐨勯€€鍑虹爜瑙勫垯锛堟牳蹇冪煡璇嗭級
| 閫€鍑虹爜 | 鍚箟 | xargs鍦烘櫙涓嬬殑澶勭悊寤鸿 |
|---|---|---|
| 0 | 鍛戒护姝e父瀹屾垚 | 鏃犻渶閲嶈瘯锛岀户缁笅涓€涓?/td> |
| 124 | 鍛戒护琚玹imeout寮哄埗缁堟 | 闇€瑕侀噸璇?/strong>锛屽缓璁寚鏁伴€€閬?/td> |
| 125 | timeout鑷韩澶辫触锛堝鍛戒护涓嶅瓨鍦級 | 璁板綍閿欒锛岃烦杩囪浠诲姟 |
| 126 | 鍛戒护涓嶅彲鎵ц | 妫€鏌ユ潈闄愶紝璺宠繃 |
| 127 | 鍛戒护鏈壘鍒?/td> | 鐜妫€鏌ワ紝璺宠繃 |
| 鍏朵粬闈為浂 | 瀛愬懡浠よ嚜韬€€鍑虹爜 | 鏍规嵁涓氬姟閫昏緫鍐冲畾鏄惁閲嶈瘯 |
涓夈€佸疄鎴樿剼鏈竴锛氬熀纭€鐗堚€斺€旇秴鏃惰嚜鍔ㄩ噸璇?娆?/h2>
鏈€瀹炵敤鐨勮捣姝ユ柟妗堬紝閫傚悎澶у鏁版壒閲忓鐞嗗満鏅€?/p>
#!/bin/bash
# xargs-timeout-retry-basic.sh
# 鐢ㄦ硶锛歝at url-list.txt | ./xargs-timeout-retry-basic.sh
MAX_RETRIES=3
TIMEOUT_DURATION="30s"
retry_handler() {
local task="$1"
local attempt=0
local exit_code
while [ $attempt -lt $MAX_RETRIES ]; do
attempt=$((attempt + 1))
echo "[$(date '+%H:%M:%S')] 灏濊瘯 #$attempt: $task" >&2
timeout --signal=SIGTERM --kill-after=5s $TIMEOUT_DURATION \n curl -s -o /dev/null -w "%{http_code}" "$task"
exit_code=$?
if [ $exit_code -eq 0 ]; then
echo "[$(date '+%H:%M:%S')] 鎴愬姛: $task" >&2
echo "OK: $task"
return 0
elif [ $exit_code -eq 124 ]; then
echo "[$(date '+%H:%M:%S')] 瓒呮椂锛堥€€鍑虹爜124锛夛紝绛夊緟2绉掑悗閲嶈瘯..." >&2
sleep 2
else
echo "[$(date '+%H:%M:%S')] 澶辫触锛堥€€鍑虹爜$exit_code锛夛紝閲嶈瘯..." >&2
sleep 1
fi
done
echo "[$(date '+%H:%M:%S')] 鏀惧純: $task锛堝凡閲嶈瘯$MAX_RETRIES娆★級" >&2
echo "FAIL: $task"
return 1
}
export -f retry_handler
export MAX_RETRIES TIMEOUT_DURATION
xargs -P 8 -I {} bash -c 'retry_handler "{}"'
鍥涖€佸疄鎴樿剼鏈簩锛氳繘闃剁増鈥斺€旀寚鏁伴€€閬?鏃ュ織璁板綍
鐢熶骇鐜鎺ㄨ崘鏂规锛岄伩鍏嶉噸璇曢鏆村鐩爣鏈嶅姟閫犳垚浜屾浼ゅ銆?/p>
#!/bin/bash
# xargs-timeout-retry-advanced.sh
# 鐗规€э細鎸囨暟閫€閬裤€丆SV鏃ュ織銆佸け璐ョ巼缁熻
LOG_FILE="xargs-retry-$(date '+%Y%m%d').csv"
TIMEOUT_DURATION="45s"
MAX_RETRIES=5
# 鍒濆鍖栨棩蹇?echo "timestamp,task,attempt,exit_code,status" > "$LOG_FILE"
retry_with_backoff() {
local task="$1"
local attempt=0
local exit_code
local wait_time=1
while [ $attempt -lt $MAX_RETRIES ]; do
attempt=$((attempt + 1))
timeout --signal=SIGTERM --kill-after=10s $TIMEOUT_DURATION \n your-command-here "$task" > /dev/null 2>&1
exit_code=$?
if [ $exit_code -eq 0 ]; then
echo "$(date '+%Y-%m-%d %H:%M:%S'),$task,$attempt,$exit_code,SUCCESS" >> "$LOG_FILE"
echo "OK: $task"
return 0
elif [ $exit_code -eq 124 ]; then
echo "$(date '+%Y-%m-%d %H:%M:%S'),$task,$attempt,$exit_code,TIMEOUT" >> "$LOG_FILE"
echo "[閲嶈瘯 #$attempt] 瓒呮椂锛岀瓑寰?${wait_time}s..." >&2
sleep $wait_time
wait_time=$((wait_time * 2)) # 鎸囨暟閫€閬匡細1s,2s,4s,8s...
else
echo "$(date '+%Y-%m-%d %H:%M:%S'),$task,$attempt,$exit_code,ERROR" >> "$LOG_FILE"
sleep 1
fi
done
echo "$(date '+%Y-%m-%d %H:%M:%S'),$task,$MAX_RETRIES,,FAILED" >> "$LOG_FILE"
echo "FAIL: $task" >&2
return 1
}
export -f retry_with_backoff
export LOG_FILE TIMEOUT_DURATION MAX_RETRIES
xargs -P 4 -I {} bash -c 'retry_with_backoff "{}"'
浜斻€佸疄鎴樿剼鏈笁锛氱敓浜х骇鈥斺€斿苟鍙戞帶鍒?閫€鍑虹爜鏀堕泦
閫傚悎闇€瑕佺簿纭帉鎻℃瘡涓换鍔℃渶缁堢姸鎬佺殑鍦烘櫙锛堝鎵归噺鏁版嵁鍚屾锛夈€?/p>
#!/bin/bash
# xargs-timeout-retry-production.sh
# 鐗规€э細骞跺彂鏁板姩鎬佹帶鍒躲€侀€€鍑虹爜姹囨€汇€佺粨鏋滃垎绫昏緭鍑?
TIMEOUT_DURATION="60s"
MAX_RETRIES=3
MAX_PARALLEL=6
SUCCESS_FILE="/tmp/xargs-success-$$.txt"
TIMEOUT_FILE="/tmp/xargs-timeout-$$.txt"
FAILED_FILE="/tmp/xargs-failed-$$.txt"
# 娓呯悊鍑芥暟
cleanup() {
echo "=== 鎵ц缁撴灉姹囨€?==="
echo "鎴愬姛: $(wc -l < $SUCCESS_FILE) 涓?
echo "瓒呮椂: $(wc -l < $TIMEOUT_FILE) 涓?
echo "澶辫触: $(wc -l < $FAILED_FILE) 涓?
rm -f $SUCCESS_FILE $TIMEOUT_FILE $FAILED_FILE
}
trap cleanup EXIT
: > $SUCCESS_FILE
: > $TIMEOUT_FILE
: > $FAILED_FILE
retry_production() {
local task="$1"
local attempt=0
local exit_code
while [ $attempt -lt $MAX_RETRIES ]; do
attempt=$((attempt + 1))
timeout --signal=SIGTERM $TIMEOUT_DURATION \n your-command-here "$task"
exit_code=$?
case $exit_code in
0)
echo "$task" >> $SUCCESS_FILE
echo "OK: $task"
return 0
;;
124)
if [ $attempt -lt $MAX_RETRIES ]; then
sleep $((attempt * 2))
continue
else
echo "$task" >> $TIMEOUT_FILE
echo "TIMEOUT: $task"
return 124
fi
;;
*)
if [ $attempt -lt $MAX_RETRIES ]; then
sleep 1
continue
else
echo "$task" >> $FAILED_FILE
echo "ERROR($exit_code): $task"
return $exit_code
fi
;;
esac
done
}
export -f retry_production
export MAX_RETRIES TIMEOUT_DURATION SUCCESS_FILE TIMEOUT_FILE FAILED_FILE
xargs -P $MAX_PARALLEL -I {} bash -c 'retry_production "{}"'
鍏€?涓剼鏈殑閫夊瀷寤鸿
| 鑴氭湰鐗堟湰 | 閫傜敤鍦烘櫙 | 鏍稿績浼樺娍 |
|---|---|---|
| 鍩虹鐗?/td> | 绠€鍗曟壒閲忎换鍔°€佸揩閫熼獙璇?/td> | 浠g爜鏈€鐭紝5鍒嗛挓涓婃墜 |
| 杩涢樁鐗?/td> | 鐢熶骇鐜銆侀渶瑕佸璁℃棩蹇?/td> | 鎸囨暟閫€閬夸繚鎶ょ洰鏍囨湇鍔?/td> |
| 鐢熶骇绾?/td> | 澶ц妯℃壒閲忓鐞嗐€侀渶瑕佺簿纭姸鎬佺粺璁?/td> | 閫€鍑虹爜鍒嗙被姹囨€伙紝渚夸簬鍚庣画鑷姩鍖栧鐞?/td> |
涓冦€佸父瑙佸潙鐐逛笌鎺掓煡鏂规硶
- 鍧戜竴锛歵imeout鍚庤繘绋嬫湭鐪熸閫€鍑?/strong>鈥斺€斿姞涓?
--kill-after鍙傛暟锛岀‘淇漇IGKILL鍏滃簳 - 鍧戜簩锛歺args骞惰鏁拌澶ぇ瀵艰嚧绯荤粺璐熻浇鏆村鈥斺€斿缓璁?
-P鍊间笉瓒呰繃CPU鏍稿績鏁扮殑2鍊?/li> - 鍧戜笁锛氶噸璇曟椂鏈仛閫€閬匡紝瀵艰嚧鐩爣鏈嶅姟琚埛鐖?/strong>鈥斺€斿姟蹇呬娇鐢ㄦ寚鏁伴€€閬挎垨闅忔満鎶栧姩
- 鍧戝洓锛氬拷鐣ヤ簡timeout閫€鍑虹爜124鐨勫垽鏂?/strong>鈥斺€?24鏄秴鏃朵笓灞為€€鍑虹爜锛屼笉瑕佸拰涓€鑸敊璇贩涓轰竴璋?/li>
鍏€佺浉鍏虫枃绔犳帹鑽?/h2>
- xargs瓒呮椂鍚庨噸璇曟満鍒讹細3涓疄鎴樻妧宸ц鎵归噺浠诲姟涓嶅啀鍥犺秴鏃惰€屼腑鏂?/a>
- Shell鑴氭湰鎵归噺浠诲姟瓒呮椂閲嶈瘯鏈€浣冲疄璺碉細5涓疄鎴樻妧宸ц鎵归噺浠诲姟绋冲娉板北
- Shell鑴氭湰骞惰妫€娴婾TM鍙傛暟curl瓒呮椂璁剧疆锛?涓疄鎴樻妧宸ц鎵归噺宸℃绋冲畾涓嶅崱姝?/a>
鎬荤粨
鎶?timeout 鍜?xargs 閰嶅悎浣跨敤锛屾牳蹇冨氨鏄笁浠朵簨锛?strong>璁捐秴鏃躲€佸垽閫€鍑虹爜銆佸仛閲嶈瘯銆傛湰鏂囩殑涓変釜鑴氭湰浠庣畝鍗曞埌鐢熶骇绾э紝瑕嗙洊浜嗙粷澶у鏁颁娇鐢ㄥ満鏅€傚缓璁厛鍦ㄦ祴璇曠幆澧冭窇閫氬熀纭€鐗堬紝鍐嶉€愭鍗囩骇鍒板甫鏃ュ織鍜岄€€閬跨殑杩涢樁鐗堟湰銆?/p>
版权声明
本文仅代表个人观点。
本文系AI辅助作者原创,未经许可,转载请保留原文链接。

发表评论