CTRL+C
シェルスクリプトを使用してTomcatアプリケーションサーバーをシャットダウンする動作を複製する必要があります。したがって、次のコードはJenkinsパイプラインスクリプトで書かれています。
sh '''pgrep -fl catalina | awk '{print $1}' | xargs kill -SIGINT'''
しかし、申請を拒否しません。ただし、端末で同じコマンドを実行すると、アプリケーションは閉じます。
pgrep -fl catalina | awk '{print $1}' | xargs kill -SIGINT
シェルスクリプトコードの問題を理解するのに役立ちますか?
答え1
これら2つのコマンドは同じではありません。最初のコマンドは、引数を使用してスクリプトを実行しようとしますpgrep -fl catalina | awk {print
(呼び出しシェルが空であると仮定} | xargs kill -SIGINT
)。$1
「該当するファイルまたはディレクトリがありません」エラーが発生します。これは参照のために発生します。
シェルでは、トリプル一重引用符は通常の一重引用符を開始するのに不便な方法です(最初の2つの一重引用符は空の文字列になります)。そして一重引用符文字列できない一重引用符が含まれています。これは{print $1}
コマンドに引用符がないことを意味するため、シェルが展開されてから$1
(何もない場合があります)、末尾のスペースからコマンドを分割しますprint
。
実行中のパイプラインを使用するには、以下をsh
使用しますsh -c
。
sh -c 'sh pgrep -fl catalina | awk "{ print \$1 }" | xargs kill -SIGINT'
または以下を使用してくださいpkill
。
pkill -f -SIGINT catalina
または、あなたはそれを使用することができますTomcatスクリプトshutdown.sh
、またはcatalina.sh stop
、またはservice tomcat stop
。
答え2
まあ、まず、あなたは仕事を不必要に複雑にしています。
完全なコマンド名"catalina"と一致させたいと思います。その場合は、「-x」パラメータを使用したいと思います。また、「-l」を使用しないと、「awk」で削除する必要があるコマンド名を取得できません。
pgrep -x catalina
その後、「kill」コマンドラインに「pgrep」コマンドを挿入できます。
sh 'kill -SIGINT `pgrep -x catalina` '
より良い点は次のとおりです。
killall -SIGINT --exact catalina
これがある場合には機能しますが、他の場合には機能しない理由は明確ではありません。 Jenkinsパイプラインコンテキストでは別の(rootではない)ユーザーとして実行し、端末では正しい(またはroot)ユーザーとして実行していますか?