問題のスクリプトは、ローカルホストのポート8080で最新のプロセスを終了します。
#!/bin/bash
x=$(lsof -i:8080 | tail -1 | awk '{print $2}')
kill -9 $x
スクリプトに「killl」という名前が付けられている場合は、機能しませんでした(取得しますか?最新のものを削除しますか?)。それは私にcmdsubst>
スクリプトの名前を「asdf」に変更すると、すべてが機能します。この動作の説明はありますか? MacOS ElCapitánを使用しています。
_cmdsubst>
_は、コマンド置換の終了が入力されるのを待っているときにzsh
シェルによって出力される2次プロンプトです。
_killl<Return>
_を入力した後にそのプロンプトが表示される場合、唯一の妥当な説明は、killl
のエイリアス(文字列マクロ展開の一種)があり、終了していないものに展開されていることです。 $(...)
コマンド置換:
_$ alias 'killl=echo $(lsof -ti'
$ killl :22
cmdsubst>
_
zsh
は、その$(...)
コマンド置換を閉じるように求めています。
さらにいくつかのメモ:
lsof
の出力はpidでソートされます。 pid番号はラップされます。pidが大きくても、プロセスが後で開始されたという保証はありません。-i:8080
_は、リスニング、受け入れ、接続のいずれのソケットであっても、ソースポートまたは宛先ポートとして8080ポートを持つTCPまたはUDPソケットを報告します。lsof
の_-t
_オプションを使用できます:_lsof -ti:8080 | tail -n2
_kill -9
_は_kill -s KILL
_であり、アプリケーションが正常に終了するように動作できないという信号を送信します。最後の手段としてのみ使用してください。ポート8080にバインドされたソケット(両端)を持つ最後に開始されたプロセスを強制終了するには、次のようにします。
_#! /bin/sh -
unset IFS
pids=$(lsof -ti:8080) &&
LC_ALL=C ps -o pid=,lstart= -p $pids |
LC_ALL=C sort -k6,6n -k4,4M -k3,3n -k5,5 -k1,1n |
awk 'END{system("kill " $1)}'
_
(GNU sort
(macOSにあります))およびps
カラムをサポートするlstart
実装(macOS 'およびprocps-ただし、月と日のフィールドが入れ替わるprocps-ngではコードを更新する必要があります))。