我正在尝试创建一个 systemd 单元文件来替换命令
RAILS_ENV=development bundle exec rails resque:start_workers[2]
以便工人在机器启动时即可启动。我创建的文件是:
[Unit]
Description=background workers
After=httpd.service solr.service
[Service]
Environment=RAILS_ENV=development
ExecStart=/usr/local/bin/bundle exec rails resque:restart_workers[2]
User=deploy
WorkingDirectory=/opt/wonda/current
Environment=rvm_bin_path=/usr/local/rvm/bin
Environment=GEM_HOME=/usr/local/rvm/gems/ruby-2.5.1
Environment=SHELL=/bin/bash
Environment=IRBRC=/usr/local/rvm/rubies/ruby-2.5.1/.irbrc
Environment=MY_RUBY_HOME=/usr/local/rvm/rubies/ruby-2.5.1
Environment=LD_LIBRARY_PATH=/opt/rh/rh-php71/root/usr/lib64
Environment=PATH=/usr/local/rvm/gems/ruby-2.5.1/bin:/usr/local/rvm/gems/ruby-2.5.1@global/bin:/usr/local/rvm/rubies/ruby-2.5.1/bin:/usr/local/rvm/bin:/opt/rh/rh-php71/root/usr/bin:/opt/rh/rh-php71/root/usr/sbin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/usr/sbin:/usr/local/sbin:/opt/puppetlabs/bin
Environment=GEM_PATH=/usr/local/rvm/gems/ruby-2.5.1:/usr/local/rvm/gems/ruby-2.5.1@global
Environment=DBUSER=wonda
Environment=DBPASS=***************
[Install]
WantedBy=multi-user.target
当我运行它时,系统似乎尝试启动工作程序,甚至给了我一个 pid,但没有显示它们正在运行我们已经向其添加了日志记录,但没有输出。
谁能告诉我我做错了什么?
答案1
您似乎正在使用rvm
但必须手动设置很多东西。rvm-exec
似乎是为此目的而设计的。如果您可以rvm-exec
在终端中工作,那么当您将其转换为服务时,出错的可能性就会减少......
<检查剩余的事情是否有问题>
ExecStart=/usr/local/bin/bundle exec rails resque:restart_workers[2]
那么它从哪里来resque:restart_workers
,嗯?
这听起来像是使用错误的准备协议的经典问题。然后当systemd
杀死所有进程时感到惊讶,因为它是什么想法是你的主要进程,只是分叉然后退出。
如果可能的话,您使用 systemd 运行的命令应该不是分叉到“后台进程”。例如,如果您在终端中运行它,您想要一个在前台运行的命令。这将与隐含的默认[service]
类型一起很好地工作Type=simple
。尽管设置Type=exec
可以提供更好的错误报告,但我不知道有什么理由不喜欢它:-)。
如果您不能 - 或者您需要准确地知道您的服务何时启动,并且它正确地实现Type=forking
就绪协议,但没有比这更好的了 - 您可以添加Type=forking
.