ไฟล์ 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