: 引数はプロセスまたはジョブIDである必要があります

: 引数はプロセスまたはジョブIDである必要があります

両方の OS が Ubuntu 18.04.1 LTS であるリモート マシン上の特定のポート (たとえば 8080) で実行されている特定のプロセス/サービスを強制終了する簡単な bash スクリプト (以下、killprocess.sh と呼びます) を実行したいと考えています。

スクリプトを実行するために、次のように ssh (openssh) 経由で接続を確立しました。接続も正常に確立されました。

sshpass -p "password" ssh -n [email protected] -f "/bin/bash /home/killprocess.sh"

killprocess.sh の内容は以下の通りです。

processID=$(lsof -t -i:8080)
echo $processID
kill $processID

プロセス ID はコンソールに正しく表示されますが、プロセスを強制終了できないことを示す以下のエラー メッセージが表示されます。

: 引数はプロセスまたはジョブIDである必要があります

答え1

fromdos killprocess.shスクリプトを動作させるには、コマンドを実行します(コマンドはtofrodosパッケージに含まれています)。

その理由は次のとおりです。

エラーメッセージは、スクリプトをWindowsのテキストエディタで書いたことを示しています。このエディタでは行末の処理が異なります(\r\n単に ではなく行末に追加されます\n)。エラーメッセージは疑わしいものです。

bash: kill: meh: arguments must be process or job IDs

killコマンドの引数に (キャリッジ リターン) 文字が含まれている場合にのみ、あなたが言及したような行が出力されます\r。したがって、エラー メッセージが印刷されるとき、3 番目のコロンの前でカーソルが行の先頭に戻り、エラー メッセージの残りの部分によって、それまでに印刷されていた内容が上書きされます。これは、コマンドがエラーを出した理由も説明しています。コマンドは、プロセス ID ではない のkillようなものを受け取りました。1234\r

おそらくこれは、スクリプトの最初の行が実際には

processID=$(lsof -t -i:8080)\r

しかし、\rこの文字は印刷されない文字なので、当然見ることはできません。2 行目の出力ではこの文字を見ることはできません。行を出力するとカーソルが先頭に戻りますが、その後、改行文字によってカーソルが次の行に移動するからです。

ちなみに、bash エラー メッセージがコロンで始まる場合は、常に Unix/Windows の行末の問題が疑われます。

関連情報