วิธีดำเนินการคำสั่งหลังจากคำสั่งปัจจุบันทำงานในทุบตี?


18

ฉันกำลังดาวน์โหลดไฟล์ด้วย wget และฉันต้องการปิดคอมพิวเตอร์หลังจากการดาวน์โหลดจะเสร็จสิ้น แต่ฉันต้องไปที่อื่นตอนนี้ :) เป็นไปได้ไหมที่จะใช้คำสั่งใน bash exacly เมื่อกระบวนการเสร็จสิ้นหรือไม่

ฉันรู้ว่ามันใช้งานได้:

wget http://example.com/file.rar; ปิดตอนนี้

แต่ถ้าฉันพิมพ์เท่านั้น:

wget http://example.com/file.rar

2
ลองใช้ && และ || แทน ;. && และ || ตรวจสอบค่าส่งคืนของคำสั่งก่อนหน้านี้ก่อนดำเนินการคำสั่งถัดไป ... ในกรณีที่การเรียกใช้ล้มเหลวคุณอาจไม่ต้องการปิดเครื่อง
KFro

คำตอบ:


31

คุณสามารถทำสิ่งนี้:

  1. หยุดการทำงานของ wget ด้วย ctrl-z (มันไม่หยุดทำงานมันหยุดทำงานชั่วคราว)
  2. วางไว้ในพื้นหลัง (bg)
  3. วิ่ง: รอ; ปิดตอนนี้

รอจะรอให้โปรแกรมทั้งหมดทำงานในพื้นหลังจากเปลือกปัจจุบัน - เช่นนี้ wget

หลังจากรอจะเสร็จสิ้น - การปิดเครื่องจะดำเนินต่อไป


อย่าลืมที่จะเบื้องหน้า (fg) อินสแตนซ์ wget ของคุณเมื่อเสร็จแล้ว หาก wget ทำงานอยู่แล้วคุณสามารถใส่ไว้เบื้องหน้าด้วย ^ z (control-z)
Andrew Scagnelli

4
ไม่จำเป็นเว้นแต่คุณจะต้องการเห็นแถบความคืบหน้าจริงๆ
dmckee

ไม่จำเป็นเพราะเขาทิ้งเครื่องไว้กับตัวเองแล้วปิดตัวลง
Wolf

11

ในเชลล์อื่นให้ใช้

ps -u <your username> | grep wget

เพื่อค้นหา PID ของคำสั่งที่คุณต้องการรอ

wait <PID>; shutdown -h now

ดังนั้นการปิดระบบจะไม่ทำงานจนกว่ากระบวนการจะสิ้นสุดลง ดูคำตอบของ depeszด้วย


+1, หมายเหตุ: waitจะใช้ได้เฉพาะกับคำสั่งที่เริ่มต้นจากเชลล์เดียวกัน
Chriki

4

โซลูชันของฉันคือ: หยุดงานที่ต้องทำงานเป็นเวลานานด้วย Control + Z จากนั้นพิมพ์ดังนี้:

fg; echo "Done!"

หากคุณต้องการเรียกใช้การตอบสนองที่แตกต่างกันไปตามความสำเร็จหรือความล้มเหลวของคำสั่งให้ใช้ && และ || เป็นผู้ประกอบการลัดวงจร

fg && echo "Success!" || echo "Failure!"

แก้ไข: สิ่งนี้ใช้ไม่ได้กับ sudo เพราะมันจะขอรหัสผ่านของคุณ ฉันได้ลบตัวอย่างโดยใช้ sudo หากคุณต้องการ sudo สำหรับภารกิจที่สองให้ใช้วิธีการอื่นที่โพสต์ที่นี่

ในทางกลับกันฉันเชื่อว่าทั้ง GNOME และ KDE เสนอวิธีในการเปิด / ปิดเครื่องโดยไม่ใช้ sudo โดยการส่งสัญญาณ D-Bus ที่เหมาะสมหรืออะไรบางอย่าง


+1 สำหรับfg... แต่sudoอาจมีปัญหาหากระบบแจ้งให้คุณใส่รหัสผ่าน
mark4o

อืมมม ใช่ฉันไม่ได้ใช้เคล็ดลับนี้ในการทำสิ่ง sudoing เมื่อบางอย่างเสร็จสิ้น สำหรับ sudo คุณต้องใช้กลอุบายอื่น ฉันจะแก้ไขโพสต์ของฉัน
ไรอันซี ธ อมป์สัน

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

นอกจากนี้รหัสผ่านสำหรับ sudo สามารถปิดการใช้งาน (ต่อผู้ใช้และต่อคำสั่ง) - หากผู้ใช้ได้รับอนุญาตให้ปิดผ่าน sudo ครั้งนี้เขาอาจได้รับอนุญาตให้ทำเช่นนั้นเสมอ การปิดระบบที่ไม่เป็นมิตรอาจไม่เป็นอันตรายในบางกรณี - แน่นอนว่าไม่อันตรายเท่าการเข้าถึงของผู้เยี่ยมชมบนเครื่องที่กำลังทำงาน
คุกกี้

1

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

วิธีที่ชาญฉลาดคือการเปลี่ยนไปใช้ TTY อื่น (CTRL + ALT + F1 ถึง F6) และเรียกใช้คำสั่งพร้อมกันหรือถ้าคุณใช้โปรแกรมบรรทัดคำสั่งเช่นหน้าจอคุณสามารถสร้างหน้าต่างใหม่ได้


+1 สำหรับตัวเลือกแรก ฉันกลัวว่าฉันไม่เข้าใจว่าตัวเลือกที่สองควรทำงานอย่างไร
innaM

การกดตัวอย่างเช่น CTRL + ALT + F2 จะเปลี่ยนคุณเป็นคอนโซลที่สองใหม่ซึ่งคุณสามารถเข้าสู่ระบบและพิมพ์คำสั่งด้วยวิธีนี้คุณสามารถเรียกใช้คำสั่งที่สองที่นั่น ประการที่สองถ้าคุณดาวน์โหลดหน้าจอ (โปรแกรมที่ใช้คอนโซลของคุณในแบบที่เป็นแฟนซีมากขึ้น) คุณสามารถเปิดแท็บ / หน้าต่างที่สองซึ่งคุณสามารถพิมพ์คำสั่งอีกครั้งโดยไม่ต้องลงชื่อเข้าใช้อีกครั้ง แต่เมื่อคุณต้องการพร้อมกันคุณสามารถอยู่กับตัวเลือกที่ 1 ฉันไม่คิดว่าจะมีวิธีอื่นในการบรรลุผลเช่นเดียวกัน ยกเว้นว่าคุณใช้ TTY / หน้าต่างอื่นเพื่อตรวจสอบสคริปต์หากกระบวนการยังคงทำงานอยู่ :-P
Tamara Wijsman

ใช้ PID ที่รอจากคำตอบของ dmckee
Cookie

1

หากคุณต้องการได้รับแฟนซีตรวจสอบสถานะการคืนของ wget และปิดเฉพาะในกรณีที่มันประสบความสำเร็จ

% wget http://example.com/file.rar
% if [ $? -eq 0 ]
> then
> shutdown now
> fi

2
นี่เป็นวิธีการที่ดีในการสร้างสคริปต์ แต่ในขณะที่wgetรันคุณจะไม่ได้รับการตอบกลับให้สร้างการทดสอบ
dmckee

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