โหลดจำนวนมากของคาสซานดราไม่เคยออกจากข้อยกเว้นตัวชี้โมฆะดังนั้นเชลล์สคริปต์การโทรของฉันจึงไม่เห็นความล้มเหลว


0

ฉันสร้างสคริปต์ที่ประมวลผลไฟล์ในลูปโดยใช้การเรียกใช้โปรเซส ฉันตรวจสอบรหัสออกของการโทรที่ได้รับการกล่าวถึงเพื่อดูว่าฉันควรย้ายไฟล์ (ตามความสำเร็จ) หรือไม่ปัญหาคือเมื่อกระบวนการล้มเหลวโดยมีข้อยกเว้นจะไม่มีการออก ฉันจะตรวจสอบข้อยกเว้นที่เกิดขึ้นได้อย่างไรฉันจึงสามารถย้ายสคริปต์ไปยังไฟล์ถัดไปได้

ส่วนที่เกี่ยวข้องของสคริปต์

# Stream data
sstableloader -d $3 $tablepathfull

# On success, move data to target dir
if [[ $? != 0 ]]; then
    echo "Error: Table failed - $tablepathfull"
else
    echo "Table OK - $tablepathfull"
    trgtdir="$2/$hostname/$keyspacename/$typename/$timestamp/$keyspacename/$tablename"
    mkdir -p $trgtdir
    mv $tablepathfull/* $trgtdir
    rmdir $tablepathfull
fi

หากไม่มีวิธี 'เป็นทางการ' เป็นไปได้หรือไม่ที่จะจับเอาท์พุท (ดูด้านล่าง) ของการเรียกใช้กระบวนการและฆ่ากระบวนการเพียงครั้งเดียว / ถ้ามีข้อยกเว้นเกิดขึ้น?

เอาต์พุตข้อยกเว้น

Exception in thread "STREAM-OUT-/XX.XX.XXX.88" Exception in thread "STREAM-OUT-/XX.XX.XXX.92" java.lang.NullPointerException
    at org.apache.cassandra.streaming.ConnectionHandler$MessageHandler.signalCloseDone(ConnectionHandler.java:249)
    at org.apache.cassandra.streaming.ConnectionHandler$OutgoingMessageHandler.run(ConnectionHandler.java:375)
    at java.lang.Thread.run(Thread.java:744)
java.lang.NullPointerException
    at org.apache.cassandra.streaming.ConnectionHandler$MessageHandler.signalCloseDone(ConnectionHandler.java:249)
    at org.apache.cassandra.streaming.ConnectionHandler$OutgoingMessageHandler.run(ConnectionHandler.java:375)
    at java.lang.Thread.run(Thread.java:744)

ข้อยกเว้นนั้นควรเป็นเทอร์มินัล โปรดรายงานสิ่งนี้ว่าเป็นข้อผิดพลาด
Dan D.

@DanD เพื่อใครและที่ไหน และเป็นไปได้หรือไม่ว่าแอปพลิเคชัน java ที่ฉันโทรพิมพ์นั้นมีข้อยกเว้น แต่ไม่ออก ฟังดูน่าจะเป็นไปได้สำหรับฉัน ...
natli

คุณเห็นกระบวนการกับ ps หลังจากมันให้ข้อยกเว้นนั้น ควรเป็นกระบวนการย่อยสำหรับสคริปต์ของคุณ

@Radoo ฉันสามารถดูได้ใน htop
natli

จากนั้นควรเป็นข้อบกพร่องของแอป Java นั้น พฤติกรรมปกติของเครื่องมือกระบวนการอย่างง่ายหลังจากทิ้งข้อยกเว้นคือออกด้วยรหัสข้อผิดพลาด ทำไมมันถูกล็อคตลอดไปไม่ทำอะไรเลย?

คำตอบ:


2

วิธีแก้ปัญหาเดียวที่ฉันสามารถทำได้คือใช้กระบวนการย่อยและไฟล์:

TEMP_FILE='/tmp/some_file.txt'

function load_table() {
  if [ $# -lt 2 ]; then
    printf "1" > "${TEMP_FILE}"
    return 1
  fi

  local param1="$1"
  local table_full_path="$2"
  local exit_code

  # Stream data
  sstableloader -d "${param1}" "${table_full_path}" >> "${TEMP_FILE}"
  exit_code=$?

  printf "\n%s" "${exit_code}" >> "${TEMP_FILE}"
}

function is_process_running() {
  if [ $# -eq 0 ]; then
    return 1
  fi
  local process_id="$1"

  ps aux | sed -r 's/[ ]+/ /g' | cut -d' ' -f2 | grep -q "${process_id}"
  return $?
}

function exceptions_count() {
  local count=$(tail -10 "${TEMP_FILE}" | grep -c "Exception")
  return $count
}



load_table "$3" "${tablepathfull}" &

# Given you have one subprocess only.. get the pid of the first subprocess in the list
job_pids=( $(jobs -p) )
load_table_job_pid=${job_pids[0]}

while is_process_running "${load_table_job_pid}" && exceptions_count -eq 0; do
  sleep 5
done

exit_code=0
if is_process_running "${load_table_job_pid}"; then
  local load_table_job_gid=$(ps x -o  "%p %r %y %x %c " | sed -r -e 's/[ ]+/ /g' -e 's/^[ ]+//g' | grep -E "^${load_table_job_pid} " | cut -d' ' -f2)
  kill -TERM -$load_table_job_gid >/dev/null 2>&1
  exit_code=1
else
  exit_code=$(tail -1 "${TEMP_FILE}")
fi

rm -f "${TEMP_FILE}"

# Your code
# On success, move data to target dir
if [ $exit_code -ne 0 ]; then
    echo "Error: Table failed - $tablepathfull"
else
    echo "Table OK - $tablepathfull"
    trgtdir="$2/$hostname/$keyspacename/$typename/$timestamp/$keyspacename/$tablename"
    mkdir -p $trgtdir
    mv $tablepathfull/* $trgtdir
    rmdir $tablepathfull
fi

คุณสามารถปรับปรุงรหัสได้โดยเพิ่มจำนวนการลองส่งซ้ำหรือบางอย่าง


การลองใหม่จะไม่ทำสิ่งใดดีเนื่องจากข้อยกเว้นดูเหมือนว่าจะเกิดขึ้นหากมีสิ่งผิดปกติเกิดขึ้นกับไฟล์ตาราง ฉันจะทดสอบสคริปต์นี้และยอมรับคำตอบทันทีที่ปัญหาเกิดขึ้นอีกครั้ง แต่มันก็ดูดี & สอนให้ฉันเกี่ยวกับ bash หรือสองเรื่องขอบคุณมาก!
natli

โอ้เพิ่งเกิดจากความอยากรู้ ไม่grep -c "Exception" "${TEMP_FILE}"อ่านไฟล์ทั้งหมดทุกครั้ง? เพราะไฟล์ที่ส่งออกสามารถรับได้ค่อนข้างใหญ่ ถ้าเป็นเช่นนั้นฉันจะแทนที่ด้วยtail -n 10เพราะ 10 บรรทัดสุดท้ายจะมีข้อยกเว้นอย่างแน่นอนหากเกิดขึ้น
natli

ใช่. จากส่วนของรหัสที่คุณเขียนฉันคิดว่าเครื่องมือ java ไม่แสดงผลอะไร local count=$(tail -10 "${TEMP_FILE}" | grep -c "Exception")

ฉันได้อัปเดตรหัสด้วยการอัปเดตล่าสุดนี้แล้ว

ดูเหมือนว่าจะทำงานได้ดี แต่ข้อยกเว้นยังไม่เกิดขึ้นดังนั้นฉันจึงไม่แน่ใจ 100% แต่ในทางทฤษฎีมันควรจะทำงานดังนั้นฉันคาดหวังว่าจะไม่มีปัญหาขอบคุณ!
natli
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.