---
title: "Dapat pemberitahuan saat perintah panjang di terminal selesai"
description: "Berhenti menunggui build yang makan empat puluh menit. Satu baris setelah perintah apa pun mengirim hasilnya ke ponsel Anda, termasuk saat Anda sudah pergi."
date: 2026-09-09
author: Nooc
authorAvatarLink: /images/avatars/nooc.webp
authorLink: https://nooc.me
tags:
  - terminal
  - shell
  - notifikasi build
  - agen koding AI
  - notifikasi webhook
---

# Dapat pemberitahuan saat perintah panjang di terminal selesai

Anda menjalankan pelatihan, satu rangkaian tes penuh, `docker build`, atau agen koding AI yang mengerjakan tugas panjang. Setelah itu tersisa dua pilihan buruk: duduk memandangi bilah kemajuan, atau pergi lalu kembali dua puluh menit kemudian dan menemukan bahwa semuanya gagal di detik kesembilan puluh.

Ada pilihan ketiga, dan panjangnya satu baris.

## Satu barisnya

Buat kanal di Echobell, salin URL webhook-nya, lalu tempelkan ini setelah apa pun yang Anda jalankan:

```bash
pnpm build; curl -sS -X POST https://hook.echobell.one/t/TOKEN_ANDA \
  -H 'content-type: application/json' \
  -d '{"title":"build selesai","body":"echobell-web"}'
```

Perhatikan `;` dan bukan `&&`. Dengan `&&`, notifikasi hanya menyala kalau perintahnya berhasil — itu justru terbalik, karena kegagalanlah yang paling ingin Anda dengar.

## Kirim juga kode keluarnya

Notifikasi yang cuma bilang "selesai" baru separuh cerita. Tangkap statusnya:

```bash
pnpm build; s=$?; curl -sS -X POST https://hook.echobell.one/t/TOKEN_ANDA \
  -H 'content-type: application/json' \
  -d "{\"title\":\"build $([ $s -eq 0 ] && echo ok || echo GAGAL)\",\"status\":\"$s\"}"
```

`s=$?` harus persis setelah perintahnya — apa pun yang menyelip di antaranya, termasuk uji `[` itu sendiri, akan menimpa `$?`.

## Jadikan fungsi shell

Mengetik itu tiap kali menggagalkan tujuannya. Taruh ini di `~/.zshrc` atau `~/.bashrc`:

```bash
notify() {
  "$@"
  local status=$?
  curl -sS -X POST "$ECHOBELL_HOOK" \
    -H 'content-type: application/json' \
    -d "{\"command\":\"$*\",\"status\":\"$status\",\"host\":\"$(hostname -s)\"}" \
    >/dev/null
  return $status
}
```

Setel `ECHOBELL_HOOK` di profil shell Anda — atau lebih baik, jauhkan sama sekali dari repositori dotfiles dan ekspor dari berkas yang tidak Anda komit. Lalu:

```bash
notify pnpm test
notify cargo build --release
notify python train.py
```

`return $status` di akhir itu penting: ia menjaga `notify` tetap transparan, sehingga `notify make && ./deploy.sh` tetap berperilaku seperti yang Anda harapkan.

Dengan payload itu, templat kanal bisa berupa:

**Judul**

```
{{command}} · {{status}}
```

**Isi**

```
di {{host}}
```

## Bunyikan hanya kalau gagal

Sebagian besar eksekusi berhasil dan Anda tidak perlu mendengarnya. Dua kanal menyelesaikan ini dengan rapi: satu biasa untuk semuanya, dan satu mode panggilan dengan kondisi:

```
status != "0"
```

Arahkan `notify` ke kanal kedua untuk hal-hal yang membuat Anda rela bangun dari tempat tidur, dan eksekusi yang sukses tetap senyap.

## Bertahan dari laptop yang ditutup dan sesi SSH yang putus

Kalau perintahnya jalan lewat SSH, menutup laptop mematikan shell dan notifikasinya tak pernah terkirim. Dua solusinya:

**tmux** — jalankan perintah di dalam sesi lalu lepas:

```bash
tmux new -d -s build 'notify pnpm build'
```

**nohup** — untuk sekali pakai:

```bash
nohup bash -c 'notify pnpm build' >/dev/null 2>&1 &
```

Keduanya membuat proses hidup lebih lama daripada koneksi Anda, dan notifikasi tetap datang entah Anda masih tersambung atau tidak.

## Agen koding AI

Pola yang sama mencakup agen CLI yang sedang menggarap tugas panjang:

```bash
notify codex exec "refaktor modul pembayaran lalu jalankan tesnya"
```

Untuk agen yang berhenti di tengah jalan menunggu manusia — persetujuan, permintaan izin — notifikasi penyelesaian adalah alat yang salah, karena eksekusinya belum selesai. Kasus itu butuh hook atau callback milik agen itu sendiri, dan lebih pantas sebuah panggilan ketimbang push. [Mengubah gerbang persetujuan agen menjadi panggilan telepon](/id/blog/ai-agent-human-in-the-loop-alerts) membahas itu, termasuk hook `Notification` milik Claude Code dan matcher `agent_needs_input`-nya.

Pakai keduanya: hook untuk "saya tersangkut", fungsi shell untuk "saya selesai".

## Yang tidak boleh masuk notifikasi

**Bukan keluaran perintahnya.** Menggoda memang menyelipkan beberapa baris terakhir build yang gagal ke dalam isi. Tahan: log build memuat token, string koneksi, dan data pelanggan lebih sering daripada dugaan orang, dan isi notifikasi berakhir di layar terkunci. Kirim kode keluarnya saja lalu lihat sendiri terminalnya.

**Bukan URL kanal, ke repositori dotfiles publik.** Siapa pun yang punya URL-nya bisa mengirim ke kanal Anda. Simpan di berkas yang tidak diversikan dan nyalakan **Hanya POST** supaya pratinjau tautan yang nyasar tidak memicunya.

## Pertanyaan umum

### Kenapa tidak pakai `terminal-notifier` atau `notify-send` saja?

Keduanya menampilkan notifikasi di mesin yang menjalankan perintah. Itu berguna selama Anda duduk di depannya. Inti susunan ini justru kasus ketika Anda tidak di sana: mesin jarak jauh, laptop tertutup, ruangan lain.

### Apakah jalan di Windows?

Polanya iya, sintaksisnya beda. Di PowerShell padanannya `Invoke-RestMethod -Method Post -Uri $env:ECHOBELL_HOOK -ContentType application/json -Body $json`, dengan `$LASTEXITCODE` menggantikan `$?`.

### Bisakah notifikasinya masuk ke jam tangan?

Bisa. Langganan dikirim ke Apple Watch yang dipasangkan, dan jujur saja itu bentuk yang paling pas untuk "build-nya sudah selesai".

### Bagaimana kalau perintahnya makan 12 jam?

Tidak ada yang kedaluwarsa di susunan ini — `curl` berjalan kapan pun perintah itu kembali. Jalankan di bawah tmux supaya koneksi yang putus tidak ikut membawa prosesnya.

### Bisakah rekan tim mendapat notifikasi yang sama?

Bisa. Bagikan kanalnya dan tiap pelanggan memilih jenis notifikasinya sendiri. Berguna di mesin pelatihan bersama, ketika lebih dari satu orang peduli bahwa GPU-nya sudah bebas lagi.

## Penutup

Satu fungsi shell, satu kanal, dan satu kondisi kalau Anda hanya mau yang gagal. Menyiapkannya sekitar dua menit, dan ia mengembalikan dua puluh menit yang biasanya habis memandangi bilah kemajuan.

[Unduh Echobell untuk iPhone](https://apps.apple.com/app/apple-store/id6743597198?pt=128151925&ct=blog-notify-when-terminal-command-finishes-id&mt=8) atau [ambil di Google Play](https://play.google.com/store/apps/details?id=one.echobell.echobellandroid), lalu cobalah pada sesuatu yang cukup lama untuk membuat Anda beranjak.

---

## Konten terkait

- [Mengubah gerbang persetujuan agen menjadi panggilan](/id/blog/ai-agent-human-in-the-loop-alerts)
- [Jangan lewatkan kegagalan GitHub Actions](/id/blog/github-actions-notifications)
- [Peringatan kegagalan cron job](/id/blog/cron-job-failure-alerts)
- [Dokumentasi pemicu webhook](/id/docs/webhook)
- [Referensi kondisi kanal](/id/docs/conditions)
