如果两个程序同时运行,这个systemd配置会抛出错误吗?

如果两个程序同时运行,这个systemd配置会抛出错误吗?

我使用 systemd 创建了这个 Laravel 配置。我在理解一切和测试一切方面都遇到了一些困难。

理论上,如果“queue”和“schedule”进程同时运行,会出现错误,因为两者同时使用“artisan”程序?
或者 nohup 程序将同时运行两个进程并且不取消任何进程?

现在看来这个配置并不冲突。

文件.ebextensions/01_files.config

files:
  "/etc/systemd/system/[email protected]":
    mode: "000644"
    owner: root
    group: root
    content: |
      [Unit]
      Description=Laravel %i worker
      After=network.target

      [Service]
      User=webapp
      Group=webapp
      EnvironmentFile=/opt/elasticbeanstalk/deployment/env
      WorkingDirectory=/var/app/current/
      ExecStart=/usr/bin/nohup /usr/bin/php artisan %i:work
      Restart=on-failure

文件.ebextensions/02_commands.config

commands:
  01_setvars:
    command: /opt/elasticbeanstalk/bin/get-config environment | jq -r 'to_entries | .[] | "export \(.key)=\"\(.value)\""' > /etc/profile.d/sh.local
  02_reload_daemon:
    command: systemctl daemon-reload
    ignoreErrors: true
packages:
  yum:
    jq: []

container_commands:
  01_laravel_worker_queue:
    command: systemctl enable [email protected] && systemctl restart laravel_worker@queue
    leader_only: true
  02_laravel_worker_schedule:
    command: systemctl enable [email protected] && systemctl restart laravel_worker@schedule
    leader_only: true

答案1

就 和 而言systemdnohup不是artisan程序,而是程序 的参数/usr/bin/php

nohup不关心任何其他程序或进程。如果您愿意,您没有理由无法启动同一程序的多个实例。

运行同一程序的多个实例(可以选择使用不同的参数)正是像您这样的 systemd 服务模板的[email protected]设计目的。


但是,我不明白作为 systemd 服务nohup启动时使用的原因。/usr/bin/php artisan ...

由于它被配置为系统服务(而不是用户服务),systemd 将负责完全独立于您的会话启动它,因此当您注销时它不会收到 SIGHUP 的危险。

由于您没有在服务模板中指定任何StandardOutput=StandardError=选项,因此两个实例的标准输出和标准错误输出将转到 中配置的默认输出位置systemd-system.conf,或者如果不存在,则转到工厂默认目标StandardOutput=journalStandardError=journal。因此,标准输出将不是终端,因此nohup可能不会按照您的预期php将 的输出重定向到。/var/app/current/nohup.out

因此,无论有没有nohup,输出和任何错误都应该记录到日志中,可以分别使用或进行查看。journalctl -u [email protected]journalctl -u [email protected]

相关内容