คุณจะหยุดกระบวนการ postgres ทั้งหมดด้วยpg_ctl
(หรืออย่างอื่น) ได้อย่างไรเมื่อคุณไม่จำไดเรกทอรีฐานข้อมูลคืออะไรและไม่ได้กำหนดตัวแปรสภาพแวดล้อม PGDATA ไว้
คุณจะหยุดกระบวนการ postgres ทั้งหมดด้วยpg_ctl
(หรืออย่างอื่น) ได้อย่างไรเมื่อคุณไม่จำไดเรกทอรีฐานข้อมูลคืออะไรและไม่ได้กำหนดตัวแปรสภาพแวดล้อม PGDATA ไว้
คำตอบ:
ปลอดภัยที่จะ:
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]/environ
ps -fHC postgres
postgres
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
โดยทั่วไปข้อมูลของมันจะแสดงในบรรทัดคำสั่ง
มันทำให้ฉันรู้สึกประหม่าที่เห็นการฆ่าและการโพสต์ในคำสั่งเดียวกัน หากต้องการตอบคำถามโดยใช้อย่างเดียว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 ซึ่งจะหยุดฐานข้อมูลอย่างเป็นระเบียบ
PGDATA
ตัวแปรสภาพแวดล้อม ความพยายามของฉันในการรันคำสั่งนี้ทำให้ล้มเหลวเนื่องจากไม่มีฐานข้อมูลดังกล่าวภายใต้ชื่อผู้ใช้ Linux ของฉัน
show data_directory
สามารถรันได้โดยไม่ต้องระบุฐานข้อมูลและแน่นอนว่าเซิร์ฟเวอร์ของฉันไม่มีฐานข้อมูลในชื่อของฉัน และมันก็ไม่จำเป็นต้องใช้ PGDATA ด้วยซ้ำดังนั้นฉันก็เลยต้องอธิบายว่าคุณล้มเหลว
งานนี้สำหรับฉันอ้างอิง https://stackoverflow.com/a/5408501/248616
SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = 'YOUR_NAME';