web-dev-qa-db-ja.com

スーパーバイザーから呼び出されたときにbashスクリプトが機能しない

次のシステムを使用しています。

  • Ubuntu 18.04.2 LTS

  • bash 4.4.19(1)-release

  • 監視付き3.3.1-1.1

CLIからかなりうまく機能する2つのスクリプトを作成しましたが、それらを使って監視プログラムを使用しようとすると、機能しません。

それらを手動で実行すると、両方が存在するディレクトリフォルダーにcdし、コマンドを発行します。通常、私は2つの異なるsshセッションを行っており、1つのsshウィンドウで1つのコマンドを発行し、他のsshウィンドウで他のコマンドを発行しています。

root@LPRcloud:~/lpr-scripts# ./lpr-loader.sh

そして

root@LPRcloud:~/lpr-scripts# ./file-minder.sh -s /home/ -d /home/rslsync/lpr-sync/ -e /home/rslsync -T

/etc/supervisor/supervisord.confにスーパーバイザを設定し、このディレクティブを下部に配置します。

files = /etc/supervisor/conf.d/*.conf

次のファイルをディレクトリに配置しました。

/etc/supervisor/conf.d/lpr-loader.conf

そのファイルの関連する行は次のとおりです。

[program:lpr-loader]
command=bash -c "/root/lpr-scripts/lpr-loader.sh"   ; the program (relative uses PATH, can take args)
process_name=%(program_name)s  ; process_name expr (default %(program_name)s)
numprocs=1                    ; number of processes copies to start (def 1)

[program:file-minder]
command=bash -c "/root/lpr-scripts/file-minder.sh -s /home/ -d /home/rslsync/lpr-sync/ -e /home/rslsync"  ; the program (relative uses PATH, can take args)
process_name=%(program_name)s  ; process_name expr (default %(program_name)s)
numprocs=1                    ; number of processes copies to start (def 1)

Lpr-loader.confファイルに変更を加えた後、これらのコマンドを次の順序で実行します。

root@LPRcloud:~/lpr-scripts# supervisorctl reread
file-minder: available
root@LPRcloud:~/lpr-scripts# supervisorctl status all
lpr-loader                       RUNNING   pid 6173, uptime 5:49:11
root@LPRcloud:~/lpr-scripts# service supervisor stop
root@LPRcloud:~/lpr-scripts# service supervisor start
root@LPRcloud:~/lpr-scripts# supervisorctl status all
file-minder                      RUNNING   pid 91580, uptime 0:00:02
lpr-loader                       RUNNING   pid 91581, uptime 0:00:02
root@LPRcloud:~/lpr-scripts# supervisorctl status all
file-minder                      RUNNING   pid 91580, uptime 0:00:06
lpr-loader                       RUNNING   pid 91581, uptime 0:00:06

したがって、lpr-loaderとfile-minderの両方が実行されているはずです。私もこれらの1つを引っ張る:

root@LPRcloud:~/lpr-scripts# ps aux | egrep 'lpr|minder'
root      15492  0.0  0.0  16948  1008 pts/0    S+   23:40   0:00 grep -E --color=auto lpr|minder
root      91580  0.0  0.0  23860  3648 ?        S    23:38   0:00 /bin/bash /root/lpr-scripts/file-minder.sh -s /home/ -d /home/rslsync/lpr-sync/ -e /home/rslsync
root      91581 14.0  0.0  23988  3704 ?        S    23:38   0:20 /bin/bash /root/lpr-scripts/lpr-loader.sh

しかし、スクリプトはバックグラウンドで機能していません。また、これらのスクリプトを手動で実行すると、正しく動作します。

ここで何が悪いのですか?

Lpr-loader.confで使用できる/すべきPATHディレクティブがあり、スーパーバイザに必要な作業ディレクトリを通知しますか?

前もって感謝します!

以下のコメントからの提案を実装した後、file-minderが正しく機能するようになりましたが、lpr-loaderが機能していません。 supervisorctlのステータスはすべてRUNNINGと表示していますが、ファイルやデータベースに変化はありません。スーパーバイザが実行しているログで、何が起こっているのかを知るために使用できるものはありますか?

ちなみに私はスーパーバイザーで環境指令を調べました。 conf.dの[program:lpr-loader]セクションに追加しましたが、役に立たなかったようです。 (または痛い!)

1
user3055756

異なるディレクトリにあるファイル間の同期を維持しようとしているようです。スクリプトに必要な無限ループがありますか?

基本的なスクリプトでデバッグして、問題がsupervisordのスクリプトにあるかどうかを確認することをお勧めします。例:

while true; do echo "test" >> /tmp/test.log; sleep 5; done
0
Garreth McDaid

このジョブで特定の作業ディレクトリを使用するように、supervisordを構成する必要がある可能性があります。

プログラムセクションのスーパーバイザードキュメント で構成可能なdirectory(および場合によってはenvironment)を参照してください

0
Cameron Kerr