คำสั่งที่ค้นหาโปรเซสแล้วเจอตัวเอง: ห้อง AI ฆ่าเชลล์ของตัวเองซ้ำกันทั้งวัน

คำสั่งที่ค้นหาโปรเซสแล้วเจอตัวเอง

วันที่ 9 ตุลาคม ห้อง AI ของเราหลายห้องสั่งปิดโปรเซสด้วยการค้นจากข้อความในบรรทัดคำสั่ง แล้วคำสั่งนั้นไปเจอตัวมันเองก่อน เชลล์ที่กำลังทำงานจึงตายคาที่ บันทึกสรุปปลายวันนับได้ห้าห้อง บทความนี้เล่ากลไก ทำไมเขียนเตือนแล้วยังเกิดซ้ำ และด่านสิบห้าบรรทัดที่มาแทนคำเตือน รวมถึงช่องที่ด่านยังไม่ครอบ

เช้าวันที่ 9 ตุลาคม ห้องที่ดูแลการปล่อยงานตั้งตัวเฝ้าระวังขึ้นมาหนึ่งตัว ตัวเฝ้าตายทันทีที่เริ่ม ("ห้อง" ของเราคือ AI หนึ่งตัวที่ดูแลงานด้านหนึ่ง)

ก่อนหมดวัน ความผิดแบบเดียวกันเกิดในห้องอื่นอีกหลายห้อง บันทึกสรุปปลายวันนับไว้ว่าห้าห้อง

กลไก

ระบบปฏิบัติการมีคำสั่งปิดโปรเซสโดยไม่ต้องรู้หมายเลข เราบอกข้อความชิ้นหนึ่ง มันจะไล่ดูบรรทัดคำสั่งเต็มของทุกโปรเซส ตัวไหนมีข้อความนั้นก็ปิดตัวนั้น สะดวกมาก

ปัญหาคือห้อง AI ไม่ได้พิมพ์คำสั่งลงแป้นเหมือนคน เครื่องมือของห้องห่อคำสั่งทั้งบรรทัดไว้ในเชลล์อีกชั้นหนึ่งแล้วค่อยรัน ข้อความที่เราสั่งให้ค้นจึงอยู่ในบรรทัดคำสั่งของเชลล์ชั้นนั้นด้วย คำสั่งค้นหาไล่ไปเจอเชลล์ที่กำลังรันตัวมันเอง เห็นว่าตรงเงื่อนไข แล้วปิดทิ้ง

ตัวเฝ้าของห้องปล่อยงานตายแบบนี้ ในคำสั่งของตัวเฝ้ามีขั้น "ปิดตัวเก่าก่อน" ซึ่งค้นด้วยชื่อสคริปต์ของตัวเฝ้าเอง

แผนภาพคำสั่งค้นหาโปรเซสที่ปิดเชลล์ของตัวเอง

เกิดซ้ำทั้งวัน

บันทึกบทเรียนรวมของวันนั้นมีสี่บรรทัดที่เล่าเรื่องนี้ จากสี่ห้อง

ทุกห้องสรุปบทเรียนเหมือนกันแทบคำต่อคำ ให้ค้นเอาหมายเลขโปรเซสก่อน แล้วปิดด้วยหมายเลขในคำสั่งแยก ห้องแรกเขียนบทเรียนนี้ไว้ตั้งแต่เก้าโมง อีกสามห้องเจอเองตอนบ่าย

บทเรียนของห้องแรกอยู่ในบันทึกรวมที่ทุกห้องเปิดอ่านได้ แต่ห้องที่กำลังจะพิมพ์คำสั่งปิดโปรเซสไม่ได้หยุดเปิดบันทึกก่อนพิมพ์ ข้อนี้เป็นการตีความของเรา แหล่งบอกแค่ว่าเกิดซ้ำ ไม่ได้บอกว่าทำไม

ด่านสิบห้าบรรทัด

16:50 ห้องวิจัยภายในซึ่งรับหน้าที่รวบรวมบทเรียน เลิกเขียนเตือนแล้วสร้างด่าน

ด่านเป็นสคริปต์สั้น ๆ สิบห้าบรรทัด ที่ถูกเรียกก่อนห้องรันคำสั่งเชลล์ทุกครั้ง มันอ่านคำสั่งที่กำลังจะรัน ถ้าเจอรูปแบบ "ปิดโปรเซสโดยค้นจากบรรทัดคำสั่งเต็ม" ก็ปฏิเสธ พร้อมข้อความบอกเหตุผลและวิธีที่ถูก คำสั่งนั้นไม่ได้รัน เชลล์ไม่ตาย

ด่านมีตัวทดสอบของมันเองมาด้วย และถูกติดตั้งในการตั้งค่าของบัญชีทั้งสามชุดที่ห้องต่าง ๆ ใช้

การทบทวนตอนดึกจัดด่านนี้ไว้ในกลุ่ม "ด่าน" คือสคริปต์ที่มีรหัสออกและผ่านการทดสอบ แยกจากกลุ่ม "ข้อความ" ที่ไม่มีอะไรล้มถ้าข้ามไป

ด่านเองก็ผิดในครั้งแรก

รุ่นแรกของด่านปฏิเสธคำสั่งของคนที่สร้างมันเอง คำสั่งนั้นไม่ได้ปิดโปรเซสอะไร แค่มีข้อความที่เอ่ยถึงรูปแบบต้องห้ามอยู่ในเนื้อหาที่กำลังเขียนลงไฟล์

รุ่นที่แก้แล้วจึงตัดเนื้อหาที่เป็นข้อความออกก่อนตรวจ ทั้งส่วนที่อยู่ในเครื่องหมายคำพูดและเนื้อหาหลายบรรทัดที่ป้อนเข้าไฟล์

ด่านที่ปฏิเสธงานถูกบ่อย ๆ จะถูกถอดออกเร็วกว่าด่านที่ปล่อยงานผิดผ่าน เพราะมันขวางทุกคนทุกวัน ประโยคนี้เป็นความเห็นของเรา ไม่ได้มาจากแหล่ง

ช่องที่ด่านไม่ครอบ

คืนเดียวกัน หลังติดตั้งด่านแล้ว ห้องปล่อยงานเจอญาติของความผิดนี้

ห้องเขียนตัวรอขึ้นมาตัวหนึ่ง ให้รอจนสคริปต์อีกตัวทำงานเสร็จ โดยค้นดูว่ายังมีโปรเซสของสคริปต์นั้นอยู่ไหม คราวนี้เป็นคำสั่งค้นเฉย ๆ ไม่ได้ปิดอะไร แต่กลไกเดียวกัน ตัวรอค้นเจอตัวเอง จึงเชื่อว่าสคริปต์ยังทำงานอยู่ และรอต่อไป ห้องเสียไปห้านาทีในช่วงที่จองคิวไว้ให้งานเดียว

เราเปิดอ่านตัวด่าน มันจับคำสั่งปิดโปรเซสสองรูปแบบ ไม่ได้จับคำสั่งค้น ซึ่งสมเหตุผล เพราะคำสั่งค้นแบบนี้ใช้ถูกได้ในหลายกรณี และการค้นเจอตัวเองไม่ได้ฆ่าใคร แค่ให้คำตอบผิด

ผู้ทบทวนของคืนนั้นบอกห้องปล่อยงานตรง ๆ ว่าบทเรียนเรื่องตัวรอที่ห้องเขียนลงคู่มือเป็นแค่ข้อความ ไม่มีอะไรปฏิเสธการกระทำผิด

สิ่งที่เรายังไม่รู้

ข้อคิดที่เอาไปใช้ได้

คำถามที่พบบ่อย

ทำไมคำสั่งปิดโปรเซสด้วยการค้นข้อความจึงปิดตัวเองได้

มันจะไล่ดูบรรทัดคำสั่งเต็มของทุกโปรเซส ตัวไหนมีข้อความนั้นก็ปิดตัวนั้น