nohup
Feb 12
ภาษา, ระบบ nohup signal, process, terminal Comments Off
สัปดาห์ที่แล้วพี่บอกว่าโปรแกรมที่เขียนไปมีบั๊ก ให้หาให้หน่อยว่าเกิดจากอะไร การทำงานของมันก็ง่ายคือ โปรแกรมแรกรับคำสั่งจากผู้ใช้มาดูว่าจะเรียก โปรแกรมอื่นอย่างไร จากนั้นก็เลือกโปรแกรมมาทำงาน ถ้าใช้งานตามปกติสั่งคำสั่งเสร็จแล้วกดออก มันก็ไม่มีอะไรผิดปกติ แต่อาการผิดปกติจะเกิดขึ้น เมื่อสั่งเสร็จแล้วกดปิด terminal ทิ้งทันที
ดูตอนแรกก็คิดไปถึงเรื่อง process ของลินุกซ์ว่าต้องเป็นเรื่อง process แม่เรียก process ลูกแน่ๆ แต่ขุดไปขุดมาดันไม่เกี่ยวซะงั้นแต่เกิดจากตัวที่ คาดไม่ถึงคือ signal แถมเป็น signal ที่ไม่คิดว่าจะเจอด้วยคือ hang up (คือไม่เคยเจอมาก่อนหนะ
) เป็น signal ที่เกิดเมื่อมีการปิด terminal ไป(เหมือนกับวางหูโทรศัพท์อะไรประมาณนั้นมั้ง ไม่งั้นจะชื่อ hang up หรอ) หรือ connection หลุดจาก server ที่เราต่ออยู่ วิธีแก้ก็ง่ายแสนง่าย แทนที่โปรแกรม แรกจะเรียกโปรแกรมสองตามปกติ ก็เติมคำสั่ง nohup ไปข้างหน้าซะ signal นี้ก็จะไม่มากวนอีกต่อไป หรือ จะเขียนโปรแกรมที่สอง ให้ดัก signal นี้ก็ได้นะ แต่โปรแกรมที่เรียกขึ้นมาคิดว่าส่วนใหญ่คงแตะต้องโค้ดไม่ได้
ตัวอย่างๆ
File: invoker.c
#include
int main() {
system("runner");
while(1);
}
จากโค้ดด้านบนพอรันโปรแกรมนี้เสร็จมันจะไปเรียกอีกโปรแกรมนึงชื่อว่า runner โดย runner จะทำงานอยู่อีก process นึงแบบเงียบๆ ไป ถ้าเกิดเรากด ctrl-c หรืออะไร ทำยังไงก็ได้ให้โปรแกรมแรกปิด โดยที่เราไม่ปิด terminal โปรแกรมที่สองก็จะทำงานอยู่ได้โดยไม่มีปัญหาอะไร (ctrl-c แม้จะเกิด signal แต่เกิดขึ้นกับ process แรกไม่ไปยัง process สอง – แต่ยังไม่ได้ลองนะ ถ้าผิดก็ท้วงมาอีกที แนะนำให้ลองก่อน) แต่ถ้าหากขณะที่โปรแกรมเรารันอยู่แล้วกดปิด terminal เลย โปรแกรมที่สองจะได้รับ signal nohup ด้วยทันที ก็เลยแก้โค้ดเป็นด้านล่าง
system("nohup runner");
ส่วนจะใส่ & หรือไม่ & ก็ได้เพราะยังไงพอ process แรกตาย process สองจะเปลี่ยน parent เป็น init เอง
Twitter
Facebook
Google
Feed