両方の 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 の行末の問題が疑われます。