μλΉμ€κ° μ λλ€λ μκΈ°λ₯Ό λ€μλ€. μλ²μ λ€μ΄κ°μ νμΈνλ€.
$ ps -ef | grep java
deploy 3821 ... java -jar app.jar
λ μμ΄μ μ μμ΄λΌκ³ λ΅νλ€. κ·Έλλ μ λλ€κ³ νλ€.
Table of contents
Open Table of contents
λ μλλ° μ λ°κ³ μμλ€
ν¬νΈλ₯Ό λ΄€λ€.
$ netstat -tlnp | grep 8080
μ무κ²λ μ λμ¨λ€. νλ‘μΈμ€λ μλλ° ν¬νΈλ₯Ό μ μ΄κ³ μμλ€. μΆλ ₯μ μν κ°μ΄ 무μμ λ»νλμ§λ man netstat λ§€λ΄μΌμ μλ€. λ‘κ·Έλ₯Ό 보λ μμνλ€ λ°μ΄ν°λ² μ΄μ€ μ μμμ λ©μΆ° μμλ€.
2014-03-13 09:12:03 Connecting to database...
μ¬κΈ°μ λ μ λκ°λ€. μ μμ 무νμ κΈ°λ€λ¦¬κ³ μμλ€.
νλ‘μΈμ€κ° μ΄μ μμ΄λ μμ²μ λ°λλ€λ λ»μ μλλ€. κ°μλ μμ κ²λ§ λ³΄κ³ μμμΌλ μ μμ΄λΌλ λ΅μ΄ νλ¦° κ²μ μλμμ§λ§ μΈλͺ¨κ° μμλ€.
κ²μ¦ β λ¨κ³λ₯Ό λλ νμΈνλ€
μ΄ λ€λ‘ νμΈμ λ¨κ³λ‘ λλ΄λ€.
1. νλ‘μΈμ€κ° μλ ps
2. ν¬νΈλ₯Ό μ΄μλ netstat
3. μ°κ²°μ΄ λλ nc -z
4. μλ΅μ μ£Όλ curl
5. μ μ μλ΅μΈκ° μλ΅ λ΄μ© νμΈ
κ° λ¨κ³κ° λ€λ₯Έ κ²μ λ³Έλ€. netstat κΉμ§λ λμ€λλ° curl μμ λ©μΆλ κ²½μ°λ μμλ€. μ°κ²°μ λ°λλ° μ²λ¦¬κ° μ λλ μνλ€.
μ΄λ λ¨κ³μμ λκΈ°λμ§μ λ°λΌ λ³Ό κ³³μ΄ λ¬λΌμ§λ€. λ¨κ³λ₯Ό λλλ κ°μ μ λλ€λ λ§μ΄ λ€λ₯Έ μ‘°μ¬λ‘ κ°λ Έλ€.
μν νμΈ κ²½λ‘λ₯Ό λ§λ€μλ€
5λ²μ μν΄ κ°λ¨ν κ²½λ‘λ₯Ό νλ λλ€.
@RequestMapping("/health")
public Map<String, Object> health() {
Map<String, Object> m = new HashMap<String, Object>();
m.put("status", "ok");
m.put("db", checkDb() ? "ok" : "fail");
m.put("cache", checkCache() ? "ok" : "fail");
m.put("version", APP_VERSION);
return m;
}
$ curl -s http://localhost:8080/health
{"status":"ok","db":"ok","cache":"fail","version":"1.4.2"}
checkDb μ checkCache λ₯Ό κ°κ° λ΄μΌλ μΊμκ° μ λλ€λ κ²μ΄ λ°λ‘ 보μΈλ€. μμ‘΄νλ κ²μ νλμ© νμΈν΄μΌ μ΄λκ° λ¬Έμ μΈμ§ λμ¨λ€.
μν νμΈμ΄ 무거μ°λ©΄ κ·Έκ² λλ¬Έμ λΆνκ° μκΈ΄λ€.
private boolean checkDb() {
try {
jdbcTemplate.queryForObject("SELECT 1", Integer.class);
return true;
} catch (Exception e) {
return false;
}
}
SELECT 1 μ²λΌ κ°μ₯ κ°λ²Όμ΄ 쿼리λ₯Ό μ΄λ€. μ€μ μ
무 쿼리λ₯Ό λ리면 μ λλ€. μκ° μ νλ λλλ° νμΈμ΄ μ€λ 걸리λ κ² μμ²΄κ° μ΄μ μ νΈμ΄κΈ° λλ¬Έμ΄λ€.
μ λ§€ν μμ‘΄λ³΄λ€ νμ€ν μ’ λ£
μμ μ€μΈ κ²κ³Ό μ€λΉλ κ²μ ꡬλΆνλ€.
private volatile boolean ready = false;
@PostConstruct
public void onStart() {
// μ΄κΈ°ν
ready = true;
}
ready κ° μμ§ κ±°μ§μ΄λ©΄ μν κ²½λ‘κ° 503μ μ€λ€. μλ¨μ΄ κ·Έκ²μ λ³΄κ³ μμ²μ μ 보λΈλ€. μ΄κ±Έ λ£κΈ° μ μλ μμ μ€μΈ μλ²λ‘ μμ²μ΄ κ°μ μ€λ₯κ° λ¬λ€.
무νμ κΈ°λ€λ¦¬λ κ²λ κ³ μ³€λ€.
dataSource.setConnectionTimeout(10000);
μ ν΄ λ μκ° μμ μ μμ΄ μ λλ©΄ μμμ΄ μ€ν¨νκ³ νλ‘μΈμ€κ° μ£½λλ€. μ£½μΌλ©΄ κ°μκ° μμμ±κ³ λ€μ λ¬λ€.
μ λ§€νκ² μ΄μ μλ κ²λ³΄λ€ νμ€νκ² μ£½λ κ² λμνκΈ° μ½λ€. μ΄μ μμΌλ©΄ μ무λ μλμ§ μμ§λ§ μ£½μΌλ©΄ μλ¦Όμ΄ κ°λ€.
κ°μλ κ³ μ³€λ€.
# μ
pgrep -f app.jar >/dev/null || alert "νλ‘μΈμ€ μμ"
# ν
CODE=$(curl -s -o /dev/null -w '%{http_code}' --max-time 5 http://localhost:8080/health)
if [ "$CODE" != "200" ]; then
alert "μν νμΈ μ€ν¨ (HTTP ${CODE})"
fi
pgrep μ΄ μλλΌ curl μ μλ΅ μ½λλ₯Ό λ³Έλ€. λ μλλ° μ λ°λ μνλ₯Ό μ΄κ±Έλ‘ μ‘λλ€.
μ 리
- νλ‘μΈμ€κ° μ΄μ μμ΄λ μμ²μ λ°λλ€λ λ»μ μλλ€
- νμΈμ λ¨κ³λ‘ λλλ€.
psβnetstatβnc -zβcurlβ μλ΅ λ΄μ© - μ΄λμ λκΈ°λμ§μ λ°λΌ λ³Ό κ³³μ΄ λ¬λΌμ§λ€
- μν νμΈ κ²½λ‘λ₯Ό λ§λ€κ³ μμ‘΄νλ κ²μ κ°κ° νμΈνλ€
- νμΈμ
SELECT 1μ²λΌ κ°λ³κ² νκ³ μκ° μ νμ λλ€ - μμ μ€κ³Ό μ€λΉλ¨μ ꡬλΆν΄ μλ¨μ΄ μμ²μ μ 보λ΄κ² νλ€
- μμμ μκ° μ νμ λλ€. μ λ§€νκ² μ΄μ μλ κ²λ³΄λ€ νμ€νκ² μ£½λ κ² λ«λ€
- κ°μκ°
pgrepλ§ λ³΄λ©΄ μ΄ μνλ₯Ό λͺ» μ‘λλ€