2

これは簡単なことだと思いましたが、結果は私を困惑させます。

コマンドを使用してbashスクリプトを実行すると、

sudo ./restartccpd.bash

画面には何も表示されません。またの問題

sudo /etc/init.d/ccpd status

スクリプトの実行後に画面から独立して、デーモンのpidを表示するのではなく、空を生成します。これは、pkillコマンドのみが機能していることを示しています。

スクリプトの内容は、

#!/bin/bash

sudo pkill -9 ccpd
sudo /etc/init.d/ccpd start
sudo /etc/init.d/ccpd status

コマンドは、ターミナルから実行すると正常に機能します。しかし、上記で指摘したように、スクリプトとして実行すると、期待どおりに機能しません。

コマンドの間にsleepコマンドを挿入してみましたが、役に立ちませんでした。また、syslogには何も表示されません。だから、私は問題を診断することはできません。

任意の提案をいただければ幸いです。

4

2 に答える 2

6

pkillccpdコマンド名に含まれるものはすべて強制終了します。スクリプトはと呼ばれrestartccpd.bashます。最初の行は次のとおりです。

pkill ccpd

そのため、スクリプトが開始され、実行pkillされ(出力は生成されません)、すぐに自殺します。タダ!

最も簡単な解決策は、スクリプトの名前を変更することです。次のようなこともできます。

kill $(pgrep -l ccpd | grep -v restartccpd | awk '{print $1}')

これにより、一致するプロセス名とpidのリストが生成され、リストからccpd削除restartccpdされてから、でプロセスが強制終了されkillます。

于 2012-08-11T13:22:22.670 に答える
0

larskが正しく診断されると、pkill ccpd名前にが含まれているすべてのプロセスを強制終了しますccpd。スクリプトを含みます。

差し迫った修正は、-xオプションをに渡すpkillことです。これにより、名前が正確にであるプロセスのみに一致しますccpd

スクリプトにsudoコマンドが含まれている場合は、で呼び出す必要はないことに注意してくださいsudosudoまたは、スクリプトからすべての呼び出しを削除し、を使用して呼び出すこともできますsudo

ただし、このスクリプトは実行しないでください。通常、initスクリプトを呼び出して、サービスをシャットダウンする必要があります/etc/init.d/ccpd stop。デーモンを強制終了することに加えて、一時ファイルやロックの削除など、他の必要なクリーンアップを実行する場合があります。使用する必要がある唯一のケースkill -9は、何かが深刻な問題を引き起こし/etc/init.d/ccpd stopて失敗する場合です。その場合、デーモンを再起動する前に、必要なクリーンアップを手動で実行する必要があります。

あなたがやろうとしていることをする適切な方法は

sudo /etc/init.d/ccpd restart

(ディストリビューションが従来のSysVinitを使用していると仮定します— upstartを使用している場合は、sudo service ccpd restart代わりに実行する必要があります)。

于 2012-08-11T14:55:00.627 に答える