วิธีรันโค้ดในเซสชั่น tmux ใหม่ - จากภายในเซสชันปัจจุบัน?


13

ฉันใช้ Ubuntu 16.04 และฉันต้องการtmuxวิธีแก้ไขปัญหาต่อไปนี้เพราะฉันต้องการเรียกใช้กระบวนการหมดเวลาด้วยsleepในกรณีเฉพาะของฉันฉันไม่พอใจatและพบข้อบกพร่องด้วยnohup(เมื่อรวมnohup-sleep) ตอนนี้tmuxดูเหมือนจะเป็นทางเลือกที่ดีที่สุดเนื่องจากมีกลไกการไม่วางสายและทำงานได้ดีในการใช้งานด้วยตนเอง (ฉันถามคำถามเฉพาะเกี่ยวกับกระบวนการทำให้เป็นอัตโนมัติด้วยตนเองฉันสามารถทำได้ด้วยตนเอง)

สิ่งที่ฉันต้องการ:

ฉันต้องการวิธีในการดำเนินการ 3 อย่างต่อไปนี้ทั้งหมดในการดำเนินการครั้งเดียว:

  1. แนบtmuxเซสชันใหม่
  2. (sleep 30m ; rm -rf dir_name ; exit)ฉีดชุดพร้อมคำสั่งไปยังเซสชั่นว่าเหมือน โดยเฉพาะอย่างยิ่งฉันต้องการชุดหลายบรรทัดไม่ใช่แถวยาวหนึ่งแถว
  3. การดำเนินการคำสั่งด้านบนตั้งช่วงเวลาที่มันเสร็จสิ้นการเขียนเป็น stdin ในtmuxเซสชั่นใหม่

กล่าวอีกนัยหนึ่งฉันต้องการรันชุดรหัสในtmuxเซสชันอื่นที่สร้างขึ้นเป็นพิเศษสำหรับสาเหตุนั้น แต่จะทำทั้งหมดในการดำเนินการครั้งเดียว


หมายเหตุ:

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

  • ถ้าเป็นไปได้ฉันอยากได้โซลูชัน heredoc ฉันคิดว่ามันมีประสิทธิภาพมากที่สุด

คำตอบ:


18

หากคุณใส่รหัสที่คุณต้องการเรียกใช้งานเช่น/opt/my_script.shมันง่ายมากที่จะทำสิ่งที่คุณต้องการ:

tmux new-session -d -s "myTempSession" /opt/my_script.sh

นี่เป็นการเริ่มเซสชันเดี่ยวใหม่ที่ชื่อว่า "myTempSession" ซึ่งเรียกใช้งานสคริปต์ของคุณ tmux attach-session -t myTempSessionภายหลังคุณสามารถแนบไปเพื่อตรวจสอบสิ่งที่มันทำโดยการดำเนินการ

นั่นคือในความคิดของฉันทางออกที่ตรงไปตรงมาและสวยงามที่สุด ฉันไม่ทราบวิธีง่ายๆในการรันคำสั่งจาก stdin (อ่าน "จาก heredocs") ด้วย tmux โดยการแฮ็กข้อมูลคุณอาจทำได้ แต่ก็ยังเป็นแฮ็ค (และดูเหมือน)

ยกตัวอย่างเช่นที่นี่สับที่ใช้คำสั่งฉันแนะนำข้างต้นเพื่อจำลองพฤติกรรมที่คุณต้องการ (= รันโค้ดในเซสชั่น tmux ใหม่จาก heredoc ได้. ไม่มีการเขียนเกิดขึ้นบนฮาร์ดไดรฟ์ของเซิร์ฟเวอร์ที่เป็นไฟล์ชั่วคราวถูกสร้างขึ้น/dev/shmซึ่งเป็น tmpfs):

(
  cat >/dev/shm/my_script.sh &&
  chmod +x /dev/shm/my_script.sh &&
  tmux new-session -d '/dev/shm/my_script.sh; rm /dev/shm/my_script.sh'
) <<'EOF'
    echo "hacky, but works"
EOF

1
เรียนมาริโอ ยินดีที่จะอ่านคำตอบของคุณเสมอ ฉันไม่แน่ใจว่าฉันเข้าใจถูกต้องหรือไม่โปรดบอกฉันว่าฉันผิด: 1.มีสองวิธีที่จะทำเช่นนั้นวิธีแรกเกี่ยวข้องกับการสร้างสคริปต์ชั่วคราว (ที่มีรหัส) และดำเนินการด้วยการสร้างและที่สองคือ heredoc ทาง 2.หากวิธีที่สองใช้งานได้ (เมื่อแต่ละแถวเสียงสะท้อนมีรหัสแต่ละแถวของ heredoc) ทำไมเราจึงเห็นว่านี่เป็นแฮ็คถ้าเป็นรหัสที่ถูกต้องของ Bash อาจเป็นเพราะแถวของ heredoc นั้นถูกสะท้อนและไม่ได้ทำงานเป็นประจำใน heredocs?
JohnDoea

2
@Benia มันแฮ็คเพราะมันใช้ได้กับระบบ Unix บางระบบ/dev/shmเท่านั้น tmuxนอกจากนี้ยังเป็นสับเนื่องจากมันมีความซับซ้อนมากขึ้นยากที่จะอ่านเพื่อทำความเข้าใจและการรักษากว่าเพียงแค่เขียนสคริปต์ไปยังแฟ้มสามัญและเริ่มต้นด้วย
Kusalananda

1
ตามที่ @Kusalananda อธิบายแล้ว heredocs สำหรับการเรียกใช้โค้ดเป็นการปฏิบัติที่ไม่ดีโดยทั่วไป ค่อนข้างน่าเกลียดและไม่มีใครรักษามันใช้ได้ แต่มันบังคับให้คุณหาทางอ้อมในการทำสิ่งที่ง่ายมาก ... แค่เปรียบเทียบบล็อกโค้ดตัวแรกและตัวที่สองในคำตอบ: คุณบอกได้ไหมว่ามันทำงานอย่างไร ใช้เวลานานแค่ไหนในการทำเช่นนั้น? มันมากยิ่งขึ้นสับเป็น tmux มีวิธีการดำเนินการคำสั่งจาก stdin (ยกเว้นแม้กระทั่งวิธีมากขึ้น-hacky น่าเกลียดฉันจะไม่ได้พิจารณา) ไม่ดังนั้นสคริปต์ภายนอกเป็นเพียง (คำตอบ1.ของคำถามของคุณ) วิธี .
Mario Vitale

1
ขออภัยมีข้อผิดพลาดในตัวอย่างแรก (คำสั่ง "เซสชันใหม่" ไม่ได้บอกเป็นนัยถ้าคุณใช้อาร์กิวเมนต์) ตอนนี้มันได้รับการแก้ไข
Mario Vitale

1
ตอนนี้เมื่อฉันรันtmux new-session -d -s "myTempSession" /opt/my_script.shมันไม่ได้เปิดไฟล์ชั่วคราวสำหรับฉันที่จะวางรหัส ... สิ่งที่ฉันต้องการคือการเปิดสคริปต์โดยตรงจากเซสชันปัจจุบันหรืออย่างน้อยสิ่งที่จะย้ายไปที่เซสชั่นใหม่แล้วกลับไปที่ เซสชันปัจจุบัน BTW ฉันวางแผนที่จะมอบเงินรางวัลสำหรับความช่วยเหลือทั้งหมดของคุณเนื่องจากมันเป็นอย่างน้อยที่สุดที่ฉันสามารถทำได้เพื่อขอบคุณและฉันจะให้เงินรางวัลภายใน 11 ชั่วโมง
JohnDoea

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.