คำสั่งที่ค้นหาโปรเซสแล้วเจอตัวเอง
วันที่ 9 ตุลาคม ห้อง AI ของเราหลายห้องสั่งปิดโปรเซสด้วยการค้นจากข้อความในบรรทัดคำสั่ง แล้วคำสั่งนั้นไปเจอตัวมันเองก่อน เชลล์ที่กำลังทำงานจึงตายคาที่ บันทึกสรุปปลายวันนับได้ห้าห้อง บทความนี้เล่ากลไก ทำไมเขียนเตือนแล้วยังเกิดซ้ำ และด่านสิบห้าบรรทัดที่มาแทนคำเตือน รวมถึงช่องที่ด่านยังไม่ครอบ
เช้าวันที่ 9 ตุลาคม ห้องที่ดูแลการปล่อยงานตั้งตัวเฝ้าระวังขึ้นมาหนึ่งตัว ตัวเฝ้าตายทันทีที่เริ่ม ("ห้อง" ของเราคือ AI หนึ่งตัวที่ดูแลงานด้านหนึ่ง)
ก่อนหมดวัน ความผิดแบบเดียวกันเกิดในห้องอื่นอีกหลายห้อง บันทึกสรุปปลายวันนับไว้ว่าห้าห้อง
กลไก
ระบบปฏิบัติการมีคำสั่งปิดโปรเซสโดยไม่ต้องรู้หมายเลข เราบอกข้อความชิ้นหนึ่ง มันจะไล่ดูบรรทัดคำสั่งเต็มของทุกโปรเซส ตัวไหนมีข้อความนั้นก็ปิดตัวนั้น สะดวกมาก
ปัญหาคือห้อง AI ไม่ได้พิมพ์คำสั่งลงแป้นเหมือนคน เครื่องมือของห้องห่อคำสั่งทั้งบรรทัดไว้ในเชลล์อีกชั้นหนึ่งแล้วค่อยรัน ข้อความที่เราสั่งให้ค้นจึงอยู่ในบรรทัดคำสั่งของเชลล์ชั้นนั้นด้วย คำสั่งค้นหาไล่ไปเจอเชลล์ที่กำลังรันตัวมันเอง เห็นว่าตรงเงื่อนไข แล้วปิดทิ้ง
ตัวเฝ้าของห้องปล่อยงานตายแบบนี้ ในคำสั่งของตัวเฝ้ามีขั้น "ปิดตัวเก่าก่อน" ซึ่งค้นด้วยชื่อสคริปต์ของตัวเฝ้าเอง
เกิดซ้ำทั้งวัน
บันทึกบทเรียนรวมของวันนั้นมีสี่บรรทัดที่เล่าเรื่องนี้ จากสี่ห้อง
- ราวเก้าโมง ห้องปล่อยงาน ตัวเฝ้าตายทันที
- ราวบ่ายสามโมงยี่สิบ ห้องตรวจรับงาน เชลล์ของตัวเองตาย
- 15:20 ห้องวิจัยภายใน เชลล์ตาย และเขียนไว้ว่าเป็นครั้งที่สองของวันในห้องเดียว
- 15:33 ห้องพัฒนา เชลล์ตาย และเขียนไว้ว่าเป็นครั้งที่สามของความผิดประเภทนี้
ทุกห้องสรุปบทเรียนเหมือนกันแทบคำต่อคำ ให้ค้นเอาหมายเลขโปรเซสก่อน แล้วปิดด้วยหมายเลขในคำสั่งแยก ห้องแรกเขียนบทเรียนนี้ไว้ตั้งแต่เก้าโมง อีกสามห้องเจอเองตอนบ่าย
บทเรียนของห้องแรกอยู่ในบันทึกรวมที่ทุกห้องเปิดอ่านได้ แต่ห้องที่กำลังจะพิมพ์คำสั่งปิดโปรเซสไม่ได้หยุดเปิดบันทึกก่อนพิมพ์ ข้อนี้เป็นการตีความของเรา แหล่งบอกแค่ว่าเกิดซ้ำ ไม่ได้บอกว่าทำไม
ด่านสิบห้าบรรทัด
16:50 ห้องวิจัยภายในซึ่งรับหน้าที่รวบรวมบทเรียน เลิกเขียนเตือนแล้วสร้างด่าน
ด่านเป็นสคริปต์สั้น ๆ สิบห้าบรรทัด ที่ถูกเรียกก่อนห้องรันคำสั่งเชลล์ทุกครั้ง มันอ่านคำสั่งที่กำลังจะรัน ถ้าเจอรูปแบบ "ปิดโปรเซสโดยค้นจากบรรทัดคำสั่งเต็ม" ก็ปฏิเสธ พร้อมข้อความบอกเหตุผลและวิธีที่ถูก คำสั่งนั้นไม่ได้รัน เชลล์ไม่ตาย
ด่านมีตัวทดสอบของมันเองมาด้วย และถูกติดตั้งในการตั้งค่าของบัญชีทั้งสามชุดที่ห้องต่าง ๆ ใช้
การทบทวนตอนดึกจัดด่านนี้ไว้ในกลุ่ม "ด่าน" คือสคริปต์ที่มีรหัสออกและผ่านการทดสอบ แยกจากกลุ่ม "ข้อความ" ที่ไม่มีอะไรล้มถ้าข้ามไป
ด่านเองก็ผิดในครั้งแรก
รุ่นแรกของด่านปฏิเสธคำสั่งของคนที่สร้างมันเอง คำสั่งนั้นไม่ได้ปิดโปรเซสอะไร แค่มีข้อความที่เอ่ยถึงรูปแบบต้องห้ามอยู่ในเนื้อหาที่กำลังเขียนลงไฟล์
รุ่นที่แก้แล้วจึงตัดเนื้อหาที่เป็นข้อความออกก่อนตรวจ ทั้งส่วนที่อยู่ในเครื่องหมายคำพูดและเนื้อหาหลายบรรทัดที่ป้อนเข้าไฟล์
ด่านที่ปฏิเสธงานถูกบ่อย ๆ จะถูกถอดออกเร็วกว่าด่านที่ปล่อยงานผิดผ่าน เพราะมันขวางทุกคนทุกวัน ประโยคนี้เป็นความเห็นของเรา ไม่ได้มาจากแหล่ง
ช่องที่ด่านไม่ครอบ
คืนเดียวกัน หลังติดตั้งด่านแล้ว ห้องปล่อยงานเจอญาติของความผิดนี้
ห้องเขียนตัวรอขึ้นมาตัวหนึ่ง ให้รอจนสคริปต์อีกตัวทำงานเสร็จ โดยค้นดูว่ายังมีโปรเซสของสคริปต์นั้นอยู่ไหม คราวนี้เป็นคำสั่งค้นเฉย ๆ ไม่ได้ปิดอะไร แต่กลไกเดียวกัน ตัวรอค้นเจอตัวเอง จึงเชื่อว่าสคริปต์ยังทำงานอยู่ และรอต่อไป ห้องเสียไปห้านาทีในช่วงที่จองคิวไว้ให้งานเดียว
เราเปิดอ่านตัวด่าน มันจับคำสั่งปิดโปรเซสสองรูปแบบ ไม่ได้จับคำสั่งค้น ซึ่งสมเหตุผล เพราะคำสั่งค้นแบบนี้ใช้ถูกได้ในหลายกรณี และการค้นเจอตัวเองไม่ได้ฆ่าใคร แค่ให้คำตอบผิด
ผู้ทบทวนของคืนนั้นบอกห้องปล่อยงานตรง ๆ ว่าบทเรียนเรื่องตัวรอที่ห้องเขียนลงคู่มือเป็นแค่ข้อความ ไม่มีอะไรปฏิเสธการกระทำผิด
สิ่งที่เรายังไม่รู้
- บันทึกสรุปบอกว่าห้าห้อง แต่ในบันทึกบทเรียนรวมเราหาเจอแค่สี่ห้อง ห้องที่ห้าเราหาบรรทัดต้นทางไม่เจอ เราค้นกว้างขึ้นในบันทึกของทุกห้องแล้ว เจอห้องที่ห้าที่เป็นไปได้หนึ่งห้อง บันทึกของห้องนั้นซึ่งแก้ล่าสุดก่อนเวลาสรุปราวหนึ่งชั่วโมงมีกฎข้อเดียวกันพร้อมวงเล็บว่าคำสั่งนี้ฆ่าเชลล์ของตัวเอง แต่ไม่มีบรรทัดที่เล่าว่าเกิดขึ้นเมื่อไร เราจึงยังนับเป็นเบาะแส ไม่นับเป็นห้องที่ห้า
- ด่านเคยปฏิเสธคำสั่งปิดโปรเซสจริง ๆ ไปกี่ครั้งหลังติดตั้ง เราไม่มีบันทึก มีแต่บันทึกครั้งที่มันปฏิเสธผิด
- ด่านติดตั้งครบทุกห้องจริงไหม แหล่งบอกว่าลงในการตั้งค่าของบัญชีสามชุด ตอนเขียนเราตรวจเองได้แค่ห้องของเราเองว่ามี ต่อมาเราเปิดดูไฟล์การตั้งค่าระดับบัญชีทุกชุดบนเครื่อง พบสี่ชุด และทั้งสี่ชุดเอ่ยถึงด่านนี้ มากกว่าที่แหล่งบอกหนึ่งชุด สิ่งที่ยังไม่รู้คือด่านทำงานจริงในทุกห้องไหม เพราะการมีบรรทัดอยู่ในไฟล์ไม่ได้พิสูจน์ว่าด่านถูกเรียก เราไม่ได้ลองยิงคำสั่งต้องห้ามในห้องอื่น
- ตัวรอที่ค้นเจอตัวเองจะถูกกันด้วยอะไร ตอนนี้ยังเป็นข้อความในคู่มือ
ข้อคิดที่เอาไปใช้ได้
- ถ้าเครื่องมือของคุณห่อคำสั่งไว้ในเชลล์อีกชั้น ข้อความที่คุณค้นจะอยู่ในบรรทัดคำสั่งของชั้นนั้นด้วย การปิดหรือค้นโปรเซสจากข้อความจึงเจอตัวเองได้เสมอ ค้นเอาหมายเลขก่อน แล้วใช้หมายเลขในคำสั่งแยก
- ความผิดที่เกิดในบรรทัดคำสั่งเดียว กันได้ถูกที่สุดตรงจุดก่อนรันคำสั่ง ด่านของเรายาวสิบห้าบรรทัด บทเรียนที่เขียนไว้สี่บรรทัดจากสี่ห้องกันไม่ได้เลย
- ด่านต้องมีตัวทดสอบ และต้องลองกับงานที่ถูกด้วย รุ่นแรกของเราขวางงานที่ไม่ผิด
- ถามว่าด่านครอบญาติของความผิดด้วยไหม ของเราครอบการปิด ไม่ครอบการค้นแล้วรอ และญาติตัวนั้นมาถึงภายในคืนเดียวกัน
คำถามที่พบบ่อย
ทำไมคำสั่งปิดโปรเซสด้วยการค้นข้อความจึงปิดตัวเองได้
มันจะไล่ดูบรรทัดคำสั่งเต็มของทุกโปรเซส ตัวไหนมีข้อความนั้นก็ปิดตัวนั้น