根据这篇文章,谷歌提到
您可能会在公共图像中看到以下操作,但不要遵循它们的示例:
- 使用supervisord等进程管理系统来管理容器中的一个或多个应用程序。
我知道使用 Supervisord 管理一个容器中的多个应用程序有很多缺点。例如不适合自动缩放、难以进行健康检查等。但是它还有其他缺点吗?我想知道supervisord如何处理PID 1问题?
我正在 docker 容器上尝试 Supervisord 来尝试控制容器内的两个进程。目前,进程 1 每 10 秒键入一次“我是进程 1”,进程 2 每隔 10 秒键入一次“我是进程 2”。它们都是非常简单的 bash 脚本。
在 docker 日志中我遇到这个错误:
2022-04-04T15:40:56.770705073Z I am process 1
2022-04-04T15:40:56.770775532Z 2022-04-04 15:40:56,770 CRIT uncaptured python exception, closing channel <POutputDispatcher at 140473979288352 for <Subprocess at 140473979288304 with name PROGRAM1 in state RUNNING> (stdout)> (<class 'OSError'>:[Errno 29] Illegal seek [/usr/lib/python3/dist-packages/supervisor/supervisord.py|runforever|218] [/usr/lib/python3/dist-packages/supervisor/dispatchers.py|handle_read_event|281] [/usr/lib/python3/dist-packages/supervisor/dispatchers.py|record_output|215] [/usr/lib/python3/dist-packages/supervisor/dispatchers.py|_log|184] [/usr/lib/python3/dist-packages/supervisor/loggers.py|info|327] [/usr/lib/python3/dist-packages/supervisor/loggers.py|log|345] [/usr/lib/python3/dist-packages/supervisor/loggers.py|emit|227] [/usr/lib/python3/dist-packages/supervisor/loggers.py|doRollover|264])
2022-04-04T15:41:06.761850899Z I am process 2
2022-04-04T15:41:06.761913329Z 2022-04-04 15:41:06,761 CRIT uncaptured python exception, closing channel <POutputDispatcher at 140473979378128 for <Subprocess …Run Code Online (Sandbox Code Playgroud) 我正在尝试与supervisorxmlrpc 交谈.基于supervisorctl(尤其是这一行),我有以下内容,它似乎应该工作,并且确实它可以工作,只要它足够连接以从服务器接收错误:
#socketpath is the full path to the socket, which exists
# None and None are the default username and password in the supervisorctl options
In [12]: proxy = xmlrpclib.ServerProxy('http://127.0.0.1', transport=supervisor.xmlrpc.SupervisorTransport(None, None, serverurl='unix://'+socketpath))
In [13]: proxy.supervisor.getState()
Run Code Online (Sandbox Code Playgroud)
导致此错误:
---------------------------------------------------------------------------
ProtocolError Traceback (most recent call last)
/home/marcintustin/webapps/django/oneclickcosvirt/oneclickcos/<ipython-input-13-646258924bc2> in <module>()
----> 1 proxy.supervisor.getState()
/usr/local/lib/python2.7/xmlrpclib.pyc in __call__(self, *args)
1222 return _Method(self.__send, "%s.%s" % (self.__name, name))
1223 def __call__(self, *args):
-> 1224 return self.__send(self.__name, args)
1225
1226 ## …Run Code Online (Sandbox Code Playgroud) 我想在子进程日志中使用子进程的名称(如"mysuperservice_1","mysuperservice_2"等等).使用python构建的服务.
我该怎么做?TIA!=)
EDIT1
我的supervisord配置看起来像:
[program:superservice]
command = python manage.py superservice
process_name=%(program_name)s_%(process_num)s
autostart=true
autorestart=true
numprocs=4
stdout_logfile=spool/logs/superservice.log
stderr_logfile=spool/logs/superservice.error.log
Run Code Online (Sandbox Code Playgroud)
它将产生这样的过程:
dizpers 4912 0.3 0.5 170472 21976 ? Sl 22:09 0:00 python manage.py superservice
dizpers 4913 0.3 0.5 170476 22520 ? Sl 22:09 0:00 python manage.py superservice
dizpers 4920 0.2 0.5 170476 22524 ? Sl 22:09 0:00 python manage.py superservice
dizpers 4926 0.3 0.5 170476 22432 ? Sl 22:09 0:00 python manage.py superservice
Run Code Online (Sandbox Code Playgroud)
所以,我不能只是简单地获取进程名称(例如,通过psutil模块).我需要通过supervisord以某种方式获得它.
概述:
我正在尝试将 celery 作为守护进程运行来执行发送电子邮件的任务。它在开发中运行良好,但在生产中却运行不佳。我现在有了我的网站,每个功能都工作正常(没有 django 错误),但由于守护进程未正确设置,任务无法完成,并且我在 ubuntu 16.04 中收到此错误:
project_celery FATAL can't find command '/home/my_user/myvenv/bin/celery'
安装的程序/硬件,以及我到目前为止所做的事情:
我在 VPS 上使用 Django 2.0.5、python 3.5、ubuntu 16.04、rabbitmq 和 celery。我使用 venv 来完成这一切。我也安装了主管,当我检查时它正在运行sudo service --status-all,因为它旁边有一个+。Erlang 也已安装,当我检查时top,rabbitmq 正在运行。使用sudo service rabbitmq-server status表明rabbitmq也处于活动状态。
最初,我按照celery 网站上的说明进行操作,但它们非常令人困惑,并且在测试/阅读/观看其他人的解决方案约 40 小时后我无法让它工作。感到非常恼怒和挫败,我选择了这里的方向来设置守护进程并希望我能到达某个地方,并且我已经走得更远,但我收到了上面的错误。
我通读了主管文档,检查了进程状态以尝试调试问题以及程序设置,但我迷失了,因为根据文档,据我所知,我的路径是正确的。
这是我的文件结构:
home/
my_user/ # is a superuser
portfolio-project/
project/
__init__.py
celery.py
settings.py # this file is in here too
app_1/
app_2/
...
...
logs/
celery.log
myvenv/
bin/
celery …Run Code Online (Sandbox Code Playgroud) 我使用 Laravel homestead 进行开发,但我的 QA 服务器在 Amazon Linux 上。这是基于 CentOS-7 的。
我已经按照Laravel 文档中所说的方式在我的 Dev 上安装了 Supervisor
sudo apt-get install supervisor
Run Code Online (Sandbox Code Playgroud)
现在我是堆栈。
它没有说明如何卸载它,也没有说明如何在 Amazon Linux 上安装它。
如何从 Homestead 卸载 Laravel Supervisor?以及如何在 Amazon Linux 上安装/卸载它?
我正在尝试将我的 Laravel 5.5 项目升级到 5.7。我使用主管,在我configureMonologUsing()用来生成日志之前,但显然随着 5.6 升级,它贬值了。我在 L5.5 中的完整代码是:在 bootstrap/app.php 中:
$app->configureMonologUsing( function( Monolog\Logger $monolog) {
$processUser = posix_getpwuid( posix_geteuid() );
$processName= $processUser[ 'name' ];
$filename = storage_path( 'logs/laravel-' . php_sapi_name() . '-' . $processName . '.log' );
$handler = new Monolog\Handler\RotatingFileHandler( $filename );
$monolog->pushHandler( $handler );
});
Run Code Online (Sandbox Code Playgroud)
它正在生成各种记录器,例如(这很方便):
laravel-cli-root-{date},
laravel-cli-ubuntu-{date},
laravel-cli-www-data-{date},
laravel-fpm-fcgi-www-data-{date} 等...
但是,它在升级指南中说,所以我不能再使用configureMonologUsing了:
该
configureMonologUsing方法如果您使用 configureMonologUsing 方法为您的应用程序自定义 Monolog 实例,您现在应该创建一个自定义日志通道。有关如何创建自定义通道的更多信息,请查看完整的日志记录文档。
我无法弄清楚如何使用日志记录通道实现相同的目标。如何利用 Monolog Channel 编写 laravel/storage/logs 文件夹?
我使用主管在系统启动时运行 django websocket。
当我启动主管时,它会引发
ModuleNotFoundError:没有名为“django”的模块
在日志文件中。
这是主管conf:
[fcgi-program:myProject]
environment=HOME="/home/ubuntu/envFiles/myProject/bin"
# TCP socket used by Nginx backend upstream
socket=tcp://0.0.0.0:8000
directory=/home/ubuntu/projects/myProject
command=daphne -u /run/daphne/daphne%(process_num)d.sock --fd 0 --access-log - --proxy-headers myProject.asgi:application
# Number of processes to startup, roughly the number of CPUs you have
numprocs=4
process_name=asgi%(process_num)d
autostart=true
autorestart=true
stdout_logfile=/home/ubuntu/logs/project.log
redirect_stderr=true
Run Code Online (Sandbox Code Playgroud)
当我尝试通过 重新启动主管时supervisorctl restart all,它再次出现导入模块错误。
错误日志:
ModuleNotFoundError:没有名为“django”的模块
我认为它使用系统 python 路径但我environment在配置文件中定义,所以主管必须使用那里的环境。
有什么问题 ?
如何在主管 conf 中设置我的 django 环境文件?
我正在尝试将 Supervisord 与 Laravel 调度程序一起使用。它可以工作,但运行了多次,我不知道是否有任何配置错误。但我期望的是每个调度程序只有一次。如果我对这种情况有任何经验,请帮助我。
Run Code Online (Sandbox Code Playgroud)[program:laravel-scheduler] client_loop: send disconnect: Broken pipeum)02d command=php /var/www/project-api/artisan schedule:run --verbose --no-interaction [Process completed]autostart=true autorestart=true numprocs=1 user=nginx redirect_stderr=true stdout_logfile=/var/www/project-api/storage/logs/schedule.log stdout_logfile_maxbytes=10MB logfile_backups=10
Run Code Online (Sandbox Code Playgroud)protected function schedule(Schedule $schedule) { $schedule->command('telescope:prune --hours=24')->daily(); $schedule->command('horizon:snapshot')->everyFiveMinutes(); $schedule->job(new HourlyJob(), QueueName::HOURLY_JOB)->hourly(); $schedule->job(new MinuteJob(), QueueName::MINUTE_JOB)->everyTwoMinutes(); }
调度程序每两分钟正确运行一次,但问题是运行多个调度命令。请帮我解决这个问题。谢谢
supervisord ×9
python ×4
laravel ×3
django ×2
docker ×2
logging ×2
php ×2
amazon-ec2 ×1
amazon-linux ×1
celery ×1
kubernetes ×1
laravel-5.7 ×1
linux ×1
rabbitmq ×1
scheduler ×1
ubuntu ×1
xml-rpc ×1
xmlrpclib ×1