คำตอบ:
การส่งสัญญาณ0
ไปยังที่ได้รับPID
เพียงแค่ตรวจสอบว่ากระบวนการใด ๆ ที่มีให้PID
กำลังทำงานอยู่และคุณมีสิทธิ์ในการส่งสัญญาณไปยังมัน
สำหรับข้อมูลเพิ่มเติมดู manpages ต่อไปนี้:
ฆ่า (1)$ man 1 kill
...
If sig is 0, then no signal is sent, but error checking is still performed.
...
ฆ่า (2)
$ man 2 kill
...
If sig is 0, then no signal is sent, but error checking is still performed; this
can be used to check for the existence of a process ID or process group ID.
...
man 2 kill
แทน
man 1 kill
และใช้man 2 kill
มันในระบบ Fedora 20 ของฉัน มันยากที่จะมองเห็นว่าฝังทั้งหน้าคน
If sig is 0 (the null signal), error checking is performed but no signal is actually sent. The null signal can be used to check the validity of pid.
pubs.opengroup.org/onlinepubs/009695399/functions/kill.html
man 2 kill
อยู่นอกการแก้ไข 1 :)
... อาจเป็นเรื่องยากที่จะหาเอกสารเกี่ยวกับสัญญาณพิเศษนี้ แม้จะมีสิ่งที่คนอื่นพูด แต่การพูดถึงสัญญาณนี้man 1 kill
ในระบบที่ใช้เดเบียนคือ:
สัญญาณที่มีประโยชน์อย่างยิ่ง ได้แก่ HUP, INT, KILL, STOP, CONT และ 0
ไม่เป็นประโยชน์โดยเฉพาะอย่างยิ่งโดยเฉพาะอย่างยิ่งถ้าคุณไม่ทราบว่าสัญญาณทำอะไร มันไม่ได้อยู่ในรายการผลลัพธ์kill -l
ดังนั้นคุณจะไม่รู้เกี่ยวกับมันจนกว่าคุณจะรู้แล้ว
บนระบบ Debian และ Ubuntu ผลลัพธ์ของการman 2 kill
พูดส่วนที่:
หาก sig เป็น 0 จะไม่มีการส่งสัญญาณ แต่การตรวจสอบข้อผิดพลาดยังคงดำเนินการอยู่ สามารถใช้เพื่อตรวจสอบการมีอยู่ของ ID กระบวนการหรือ ID กลุ่มกระบวนการ
คุณสามารถใช้kill -0
เพื่อตรวจสอบว่ากระบวนการทำงานอยู่หรือไม่ ลองพิจารณาตัวอย่างเหล่านี้
# Kill the process if it exists and accepts signals from
# the current user.
sleep 60 &
pid=$!
kill -0 $pid && kill $pid
# Check if a PID exists. When missing, this should result
# in output similar to:
# bash: kill: (6228) - No such process
# Exit status: 1
kill -0 $pid; echo "Exit status: $?"
นอกจากนี้คุณยังสามารถใช้kill -0
เพื่อตรวจสอบว่าผู้ใช้ปัจจุบันมีสิทธิ์ในการส่งสัญญาณกระบวนการที่กำหนด ตัวอย่างเช่น:
# See if you have permission to signal the process. If not,
# this should result in output similar to:
# bash: kill: (15764) - Operation not permitted
# Exit status: 1
sudo sleep 60 &
kill -0 $!; echo "Exit status: $?"
kill(2)
ที่นี่เป็นข้อมูลโค้ด:The kill() function sends the signal specified by sig to pid, a process or a group of processes. Typically, Sig will be one of the signals specified in sigaction(2). A value of 0, however, will cause error checking to be performed (with no signal being sent). This can be used to check the validity of pid.
kill
man page: "ถ้า sig เป็น 0 จะไม่มีการส่งสัญญาณ แต่การตรวจสอบข้อผิดพลาดยังคงดำเนินการอยู่"
คำสั่งนี้ตรวจสอบว่ากระบวนการด้วย PID ใน $ pid ยังมีชีวิตอยู่
$pid
อาจทำงานอยู่ แต่คุณไม่มีสิทธิ์ในการส่งสัญญาณ
kill(1)
จะพิมพ์ข้อผิดพลาดที่แตกต่างกันสำหรับแต่ละ ดังนั้นคุณสามารถบอกได้ว่า pid ยังมีชีวิตอยู่ไม่ว่าคุณจะมีสิทธิ์ในการส่งสัญญาณหรือไม่ ยิ่งไปกว่านั้นการใช้งานทั่วไปของkill -0
ดูว่า pid ยังมีชีวิตอยู่แม้ว่าจะไม่ได้ใช้อย่างถูกต้อง ฉันว่าคำตอบนี้ถูกต้อง (นอกเหนือจากการสะกดคำ)
kill -0 $pid
ทั้งสองกรณี มันจะกลับมา1
เพื่อให้คุณไม่สามารถพูดได้โดยไม่ต้องแยกวิเคราะห์ ouput kill
ว่ากระบวนการทำงานหรือไม่ถ้าคุณไม่มีสิทธิ์ในการส่งสัญญาณไป แก้ไข: ใช่ฉันรู้ว่ามันใช้เวลาส่วนใหญ่ในการตรวจสอบว่ากระบวนการยังมีชีวิตอยู่หรือไม่ แต่นี่เป็นสิ่งที่ผิดเว้นแต่คุณจะสามารถรับประกันได้ว่าคุณได้รับอนุญาตให้ส่งสัญญาณ (เช่น: เป็นรูท)
kill
ทุบตีในตัว (คำถามที่ติดแท็กbash
) เอาท์พุทประเภทของข้อผิดพลาดใน stderr และบ่งชี้ ของข้อผิดพลาดในรหัสส่งคืน นั่นคือ "คำสั่งนี้ตรวจสอบ [ว่า] กระบวนการที่มี PID ใน $ pid ยังมีชีวิตอยู่" ถูกต้องสมบูรณ์หากคุณตีความผลลัพธ์ได้อย่างถูกต้อง [ฉันจะไม่ได้แสดงความคิดเห็นถ้าคุณไม่ได้บอกว่าคุณให้ -1 คำตอบ ความคิดเห็นของคุณไม่ถูกต้อง]
กำจัด -0 $ pid คือการตรวจสอบว่ากระบวนการที่มี pid นั้นมีอยู่หรือไม่
ระมัดระวังในขณะที่ใช้ 'kill -0 $ pid' เพื่อตรวจสอบการมีอยู่ของกระบวนการเพราะ
เมื่อกระบวนการที่ต้องการออกจากนั้น pid ของมันสามารถจัดสรรให้กับกระบวนการที่สร้างขึ้นใหม่ (ดังนั้นจึงไม่สามารถมั่นใจได้ว่ากระบวนการเฉพาะนั้นยังมีชีวิตอยู่หรือไม่)
ในกรณีของกระบวนการซอมบี้ที่เด็กกำลังรอให้ผู้ปกครองโทรหารอ ที่นี่จะถือ $ pid และให้ผลลัพธ์ที่เป็นบวกในขณะที่กระบวนการนั้นไม่ได้ทำงาน
กำจัด -0 $ pid ที่ใช้เพื่อตรวจสอบว่ากระบวนการที่ใช้ $ pid ยังมีชีวิตอยู่หรือไม่ แต่นี่อาจเป็นเรื่องยุ่งยากเนื่องจาก ID กระบวนการสามารถกำหนดใหม่ได้เมื่อการออกจากกระบวนการและกระบวนการใหม่ทำงาน หนึ่งสามารถใช้ killall -0 เพื่อรับเกี่ยวกับกระบวนการเฉพาะกำลังทำงานอยู่หรือไม่
EXIT
สัญญาณหรือ0
กระบวนการจะ:stdout
ความสำเร็จstderr
หากมีบางอย่างไม่ถูกต้องชัดเจนกว่าฟังก์ชั่นที่มีประโยชน์สำหรับเชลล์สคริปต์ของคุณคือ:
function isProcess ()
{
kill -s EXIT $1 2> /dev/null
}
สิ่งนี้จะไม่ส่งข้อความถึงstdout
เมื่อสำเร็จ แต่ข้อความแสดงข้อผิดพลาดไปยังstderr
เมื่อเกิดความล้มเหลว (แต่ฉันเปลี่ยนเส้นทางข้อความแสดงข้อผิดพลาดนั้นไป/dev/null
)
หากคุณมีความกังวลเกี่ยวกับสถานะกระบวนการตาย / ซอมบี้คุณต้องใช้ps
โดยเฉพาะอย่างยิ่งกับ--no-headers
สวิตช์
#!/bin/ksh
function trim ()
{
echo -n "$1" | tr -d [:space:]
}
function getProcessStatus ()
{
trim $(ps -p $1 -o stat --no-headers)
}
function isZombie ()
{
typeset processStatus=$(getProcessStatus $1)
[[ "$processStatus" == "Z" ]]
return $?
}