39 lines
1.2 KiB
Bash
Executable File
39 lines
1.2 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# args_json: {"type":"object","required":["pid"],"properties":{"pid":{"type":"string","description":"Process PID"},"signal":{"type":"string","description":"Signal name: TERM (default) or KILL"}}}
|
|
# ollie:prompt
|
|
# ## process_signal
|
|
#
|
|
# Send a signal to a detached background process.
|
|
#
|
|
# ```
|
|
# process_signal(pid="12345", signal="TERM")
|
|
# ```
|
|
# ollie:end
|
|
|
|
set -euo pipefail
|
|
|
|
source "${OLLIE_TOOLS_PATH:-$(dirname "$0")}/_lib/args.sh"
|
|
|
|
pid=$(arg_require "pid")
|
|
signal=$(arg_get "signal" "TERM")
|
|
session="${OLLIE_SESSION_ID:?OLLIE_SESSION_ID not set}"
|
|
|
|
# Find agent (use first agent in session)
|
|
agent=$(ollie-9p ls "session/$session/agent" 2>/dev/null | grep -v '^new$' | head -1)
|
|
[ -z "$agent" ] && { echo "error: no agent in session" >&2; exit 1; }
|
|
|
|
proc_path="session/$session/agent/$agent/proc/$pid"
|
|
|
|
case "$signal" in
|
|
TERM|KILL)
|
|
# Remove the proc file to signal termination
|
|
ollie-9p rm "$proc_path" 2>/dev/null && \
|
|
echo "Signal $signal sent to PID $pid" || \
|
|
{ echo "Failed to signal PID $pid (process may have already exited)" >&2; exit 1; }
|
|
;;
|
|
*)
|
|
echo "error: unsupported signal: $signal (use TERM or KILL)" >&2
|
|
exit 1
|
|
;;
|
|
esac
|