問題のスクリプトは、私のローカルホストポート8080の最新のプロセスを終了します。
#!/bin/bash
x=$(lsof -i:8080 | tail -1 | awk '{print $2}')
kill -9 $x
スクリプト名が「killl」の場合は動作しません(わかりましたか?Kill最新?)。cmdsubst>
スクリプト名を「asdf」に変更するように求められ、すべてがうまくいきました。この行動の説明はありますか?私はMacOS El Capitánを使用しています。
答え1
cmdsubst>
zsh
入力コマンドの置換が完了するのを待っている間にシェルが出力する補助プロンプトです。
と入力した後にこのプロンプトが表示される場合、唯一合理的な説明は、終了していないコマンド置換を含む項目に拡張されるkilll<Return>
エイリアス(文字列マクロ拡張の一種)があることです。例:killl
$(...)
$ alias 'killl=echo $(lsof -ti'
$ killl :22
cmdsubst>
ここでコマンドの置き換えをオフにzsh
するように求められます$(...)
。
追加の注:
- の出力は
lsof
pidに基づいてソートされます。 pid番号はラップされており、pidが大きくなってもプロセスが後で始まるという保証はありません。 -i:8080
ポート8080を送信元ポートまたは宛先ポートとして使用するTCPまたはUDPソケットは、受信、受け入れ、または接続ソケットであるかどうかに関係なく報告されます。- 単にpidを取得するには、次の
-t
オプションを使用できますlsof
。lsof -ti:8080 | tail -n2
kill -9
iskill -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-ng、月と日のフィールドが置き換えられるprocps-ngのコードを更新する必要がある)を想定しています。
答え2
それは私にヒントを与えた
cmdsubst>
コマンドを入力すると入力されないためです。
殺すあなたは入力
殺す$(または同様です。これは何の関係もありませんスクリプトであってもスクリプトの名前です。まったく存在しないコマンドを使用して同じ効果を得ることができます。
カイケ$(シェルのパーサーは、部分的に完了したコマンドを完了するために、より多くの入力が必要です。スクリプト名に対するあなたのアイデアは完全な赤ニシンです。