เรียกใช้คำสั่ง / สคริปต์ที่ตัดการเชื่อมต่อจากเทอร์มินัลการควบคุมหรือไม่?


9

ฉันกำลังตรวจสอบพฤติกรรมของสคริปต์ที่ปกติแล้วจะทำงานเป็นกระบวนการอัตโนมัติ (เช่น cron, Jenkins) สคริปต์สามารถ (ในที่สุด) เรียกใช้คำสั่งที่ทำงานแตกต่างกัน (ค้นหาอินพุตผู้ใช้) เมื่อรันแบบโต้ตอบ; ตัวอย่างเช่นpatchจะถามว่าจะทำอย่างไรกับแพทช์ที่กลับด้านและsvnจะขอรหัสผ่าน แต่ฉันต้องดูว่าจะเกิดอะไรขึ้นเมื่อพวกเขาทำงานแบบไม่โต้ตอบ

การโน้มน้าวใจpatchว่าการไม่โต้ตอบนั้นค่อนข้างง่าย ฉันแค่ต้องการเปลี่ยนเส้นทางstdoutให้เป็นคนที่ไม่ใช่ tty:

$ </dev/null > >(cat) /path/to/myscript --args

อย่างไรก็ตามsvnจะเชื่อมต่อกับเทอร์มินัลการควบคุมหากมีอยู่ การแก้ไขสคริปต์เพื่อส่งผ่าน--non-interactiveไม่ใช่ตัวเลือกจริงๆเนื่องจากนี่มาจากหลายระดับลึกและมันยากที่จะแน่ใจว่าฉันได้พบการเรียกใช้ทุกครั้ง

มีวิธีการเรียกใช้สคริปต์ / คำสั่งแบบไม่โต้ตอบโดยไม่มีสถานีควบคุม (เพื่อที่/dev/ttyไม่มีอยู่)? ฉันต้องการ stdout / stderr ยังคงไปที่สถานีของฉัน

(ฉันพบคำถามเรียกใช้สคริปต์ในเชลล์แบบไม่โต้ตอบแต่คำตอบสำหรับเรื่องความแตกต่างระหว่าง cron และสภาพแวดล้อมของผู้ใช้; ฉันได้กำจัดความแตกต่างทั้งหมดยกเว้นการไม่โต้ตอบ)

คำตอบ:


13

คุณต้องเริ่มเซสชันอื่นที่ไม่ได้เชื่อมต่อกับเทอร์มินัลเช่น:

$ setsid sh -c 'tty; ps -jp "$$"; echo test' < /dev/null > log 2>&1
$ cat log
not a tty
  PID  PGID   SID TTY          TIME CMD
19506 19506 19506 ?        00:00:00 sh
test

ดูstart-stop-daemonคำสั่งที่พบในการแจกแจง Linux บางรายการ นอกจากนี้ยังมีdaemonคำสั่ง


ผลลัพธ์นี้หมายความว่าอย่างไร ดูลึกลับมาก
Anatoly techtonik

2
@anatolytechtonik ส่วนที่สำคัญคือ "ไม่ใช่ tty" ซึ่งเป็นผลลัพธ์ของการttyยืนยันว่าไม่มีขั้วบน stdin และ "?" ในคอลัมน์ TTY ของpsเอาต์พุตซึ่งยืนยันว่าไม่มีการควบคุม ttyสำหรับshกระบวนการ (และสิ่งใดก็ตามที่ทำงานภายใต้)
mr.spuratic

เมื่อต้องการเรียกใช้คำสั่งเช่นคำสั่งอื่น ๆ setsid -wการใช้งาน ตัวอย่าง: setsid -w sh -c 'tty < /dev/tty'ให้sh: 1: cannot open /dev/tty: No such device or address(หมายเหตุ: /dev/ttyคือการควบคุม tty ของคุณ) โดยไม่ต้อง-wsetsid รันกระบวนการในแบบขนาน / พื้นหลัง
Tino

0

คุณอาจต้องการเขียนสคริปต์คาดหวัง ตัวอย่างกับ SVN:

/programming/609445/using-expect-to-login-into-svn


ไม่ได้ผล; คาดว่าจะรันคำสั่งแบบโต้ตอบ
ecatmur

โต้ตอบในสิ่งที่เหมาะสม? ในแง่ที่ว่ามันต้องมีการป้อนข้อมูลจากผู้ใช้หรือไม่ ถ้านั่นคือสิ่งที่คุณหมายถึงจะไม่มีจุดที่คาดหวังมากในกรณีนี้ ตัวอย่างหนึ่งที่ฉันใช้เพื่อใช้คือบน Solaris คำสั่ง passwd ไม่มีตัวเลือก --stdin ดังนั้นฉันจึงมีการตั้งค่า cronjob เพื่อเรียกใช้สคริปต์ที่คาดหวังซึ่งล้อมรอบ passwd เพื่อป้อนรหัสผ่านแบบสุ่มสำหรับบัญชี ไม่จำเป็นต้องมีปฏิสัมพันธ์กับมนุษย์ ฉันเข้าใจว่านี่เป็นความต้องการของผู้ใช้ ฉันสามารถเข้าใจผิดได้
Bratchley

จริงๆแล้วยิ่งฉันอ่านมันอีกครั้งฉันก็ยิ่งเข้าใจว่าคุณเข้าใจผิดมากขึ้นเท่านั้น ขอโทษ.
Bratchley

0

บางครั้งคุณต้องเปิด stdin ไว้ (ไม่ได้รับ eof บน stdin) (เช่นคาดว่าจะได้) ในกรณีนั้นให้เปลี่ยน / dev / null เป็น / dev / ศูนย์

setsid sh -c 'make test' </dev/zero >log 2>&1
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.