Ubuntu - สคริปต์ Ruby Daemon สร้างสองกระบวนการคือ sh และ ruby ​​ไฟล์ PID ชี้ไปที่ sh ไม่ใช่ ruby


2

ไฟล์ PID สำหรับกระบวนการทับทิมที่ฉันใช้เป็น daemon กำลังรับ PID ที่ไม่ถูกต้อง ปรากฏว่าการรัน/etc/init.d/sinatra startสร้างสองกระบวนการ - shและrubyและ PID ที่จบลงในไฟล์ PID นั้นเป็นshกระบวนการ ซึ่งหมายความว่าเมื่อฉันเรียกใช้/etc/init.d/sinatra stopหรือ/etc/init.d/sinatra restartมันคือการฆ่าดวลจุดโทษและออกจากกระบวนการทับทิมยังคงทำงานอยู่

ฉันต้องการทราบก) ทำไมสคริปต์ของฉันเปิดตัวสองกระบวนการ - sh และ ruby ​​ไม่ใช่แค่ ruby ​​และ b) ฉันจะแก้ไขได้อย่างไรเพื่อเปิด ruby

รายละเอียดการตั้งค่า:

ฉันมีเซิร์ฟเวอร์ Sinatra เล็ก ๆ ตั้งอยู่บนเซิร์ฟเวอร์ ubuntu ซึ่งทำงานเป็น daemon มันถูกตั้งค่าให้โดยอัตโนมัติเมื่อเซิร์ฟเวอร์เริ่มทำงานเรียกใช้สคริปต์sinatraในชื่อ/etc/init.dที่เรียกใช้สคริปต์ควบคุมcontrol.rbซึ่งจะรันคำสั่ง ruby ​​daemon เพื่อเริ่มเซิร์ฟเวอร์ สคริปต์นี้ทำงานภายใต้บัญชี 'sinatrauser' ซึ่งมีสิทธิ์สำหรับไดเรกทอรีที่สคริปต์ต้องการ

เนื้อหาของ /etc/init.d/sinatra

#!/bin/bash
# sinatra      Startup script for Sinatra server.

sudo -u sinatrauser ruby /var/www/sinatra/control.rb $1
RETVAL=$?

exit $RETVAL

ในการติดตั้งสคริปต์นี้ฉันก็แค่คัดลอกไปที่/etc/init.d/และวิ่ง sudo update-rc.d sinatra defaults

เนื้อหาของ /var/www/sinatra/control.rb

require 'rubygems'
require 'daemons'

pwd = Dir.pwd
Daemons.run_proc('sinatraserver.rb', {:dir_mode => :normal, :dir => "/opt/pids/sinatra"}) do
  Dir.chdir(pwd)
  exec 'ruby /var/www/sinatra/sintraserver.rb >> /var/log/sinatra/sinatraOutput.log 2>&1'
end

ส่วนของเอาต์พุตจาก ps -A

6967 ?         00:00:00 apache2
10181 ?        00:00:00 sh       <--- PID file gets this PID
10182 ?        00:00:02 ruby     <--- Actual ruby process running Sinatra
12172 ?        00:00:00 sshd

ไฟล์ PID ได้รับการสร้างขึ้น/opt/pids/sinatra/sinatraserver.rb.pidและมักจะมี PID ของอินสแตนซ์ sh ซึ่งมักจะน้อยกว่าหนึ่ง PID ของกระบวนการทับทิม

แก้ไข: ฉันลองใช้วิธีแก้ปัญหาของ micke แต่ไม่มีผลต่อพฤติกรรมที่ฉันเห็น

ps -A fนี่คือผลลัพธ์จาก ผลลัพธ์นี้ดูเหมือนกันว่าฉันใช้sudo -u sinatrauser ...หรือsu sinatrauser -c ...ในสคริปต์เริ่มบริการใน /etc/init.d

1146 ?        S      0:00 sh -c ruby /var/www/sinatra/sinatraserver.rb >> /var/log/sinatra/sinatraOutput.log 2>&1
1147 ?        S      0:00  \_ ruby /var/www/sinatra/sinatraserver.rb

คำตอบ:


1

รูปแบบของ exec ที่คุณใช้เป็นสาเหตุของสิ่งนี้ หากคุณแยกคำสั่งจากพารามิเตอร์มันจะหลีกเลี่ยงการสร้างเปลือก เห็นปัญหา GitHub นี้สำหรับคนที่แก้ไขปัญหาที่คล้ายกัน: https://github.com/sunspot/sunspot/pull/221


1

กระบวนการแรกคือ sudo ที่เปิดตัวทับทิม ps -A fตรวจสอบกับ เปลี่ยนสาย sudo เพื่อเรียกใช้คำสั่ง

su sinatrauser -c "ruby /var/www/sinatra/control.rb $1"

แก้ไข : ฉันคิดว่า su ดู neater ในสคริปต์เช่นนี้

    su - someuser <<CHBACK
    ls $HOME // do stuff
    echo "do more stuff as $USER"
    CHBACK
    echo "Now I'm $USER again"
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.