วิธีหยุดกระบวนการ postgres ได้เป็นอย่างดี


33

คุณจะหยุดกระบวนการ postgres ทั้งหมดด้วยpg_ctl(หรืออย่างอื่น) ได้อย่างไรเมื่อคุณไม่จำไดเรกทอรีฐานข้อมูลคืออะไรและไม่ได้กำหนดตัวแปรสภาพแวดล้อม PGDATA ไว้

คำตอบ:


58

ปลอดภัยที่จะ:

sudo pkill -u postgres

postgresที่ฆ่ากระบวนการทั้งหมดที่ทำงานเป็นผู้ใช้ หรือ:

pkill postgres

ที่ฆ่ากระบวนการทั้งหมดที่ชื่อว่า 'postgres'

ไม่ได้ใช้kill -9( kill -KILL) เพียงแค่kill(ไม่มีตัวเลือก) จะทำSIGTERMซึ่งเป็นสิ่งที่คุณต้องการ

หรือคุณสามารถตรวจสอบตำแหน่ง pgdata หากคุณสามารถเชื่อมต่อกับ PostgreSQL ตัวอย่างเช่น:

sudo -u postgres psql -c "SHOW data_directory";

... หรือโดยการตรวจสอบตัวแปรสภาพแวดล้อมในที่คุณระบุไปรษณีย์ด้วย ค้นหาสิ่งที่เป็นพาเรนต์ของกระบวนการอื่น ตัวอย่างเช่น:/proc/[postmaster pid]/environps -fHC postgrespostgres

postgres   794     1  0 Nov06 ?        00:00:03 /usr/pgsql-9.3/bin/postgres -D /var/lib/pgsql/9.3/data -p 5432
postgres   857   794  0 Nov06 ?        00:00:00   postgres: logger process   
postgres   871   794  0 Nov06 ?        00:00:00   postgres: checkpointer process   
postgres   872   794  0 Nov06 ?        00:00:00   postgres: writer process   
postgres   873   794  0 Nov06 ?        00:00:00   postgres: wal writer process   
postgres   874   794  0 Nov06 ?        00:00:03   postgres: autovacuum launcher process   
postgres   875   794  0 Nov06 ?        00:00:07   postgres: stats collector process   

โดยทั่วไปข้อมูลของมันจะแสดงในบรรทัดคำสั่ง


3

มันทำให้ฉันรู้สึกประหม่าที่เห็นการฆ่าและการโพสต์ในคำสั่งเดียวกัน หากต้องการตอบคำถามโดยใช้อย่างเดียวpg_ctlนั่นคือ:

pg_ctl -D $(psql -Xtc 'show data_directory') stop

อาร์กิวเมนต์ -X บอกว่าจะไม่สนใจ.psqlrcไฟล์ สิ่งนี้มีประโยชน์หากคุณมีการกำหนดค่า psql เพื่อปล่อยเวลาที่ใช้โดยแบบสอบถาม (ผ่านคำสั่ง \ timing)

อาร์กิวเมนต์ -t แจ้งว่าจะลบชื่อคอลัมน์ที่ด้านบนของเอาต์พุตและจำนวนแถวทั้งหมดที่สร้างขึ้น

อาร์กิวเมนต์ -c มีรหัส SQL ที่จะดำเนินการ

การรันเปลือยpsql -c 'show data_directory'อาจจะสร้างผลลัพธ์ต่อไปนี้:

      data_directory
--------------------------
 /path/to/postgresql/data
(1 row)

ดังนั้นการ backticking สิ่งนี้ผ่าน$( ... )จะส่ง/path/to/postgresql/dataไปยังอาร์กิวเมนต์ -D ของ pg_ctl ซึ่งจะหยุดฐานข้อมูลอย่างเป็นระเบียบ


1
ฉันเดาว่าถ้านี่เป็นงานอย่างเป็นทางการควรเป็นคำตอบที่ถูกต้อง มันเป็นตัวเลือกใหม่หรือไม่?
แมตต์

โซลูชันนี้จะได้รับประโยชน์จากการอธิบายตัวเลือกที่ใช้รวมถึงการใช้PGDATAตัวแปรสภาพแวดล้อม ความพยายามของฉันในการรันคำสั่งนี้ทำให้ล้มเหลวเนื่องจากไม่มีฐานข้อมูลดังกล่าวภายใต้ชื่อผู้ใช้ Linux ของฉัน
Stephane

show data_directoryสามารถรันได้โดยไม่ต้องระบุฐานข้อมูลและแน่นอนว่าเซิร์ฟเวอร์ของฉันไม่มีฐานข้อมูลในชื่อของฉัน และมันก็ไม่จำเป็นต้องใช้ PGDATA ด้วยซ้ำดังนั้นฉันก็เลยต้องอธิบายว่าคุณล้มเหลว
dland

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.