Score:0

ฉันจะตั้งค่าการจำกัดเวลาแบบสากลสำหรับการดำเนินการบรรทัดคำสั่งใด ๆ ได้อย่างไร

ธง in

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

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

ฉันจะทำสิ่งนี้ได้อย่างไร

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

ฉันต้องการทำสิ่งนี้บนเซิร์ฟเวอร์ Ubuntu ดังนั้นฉันจะไม่ใช้ GUI ฉันใช้ 21.04 แต่หมายเลขเวอร์ชันไม่สำคัญสำหรับฉัน

แบบนี้:

$ ls # ส่งคืนใน .05 วินาที
เอกสาร
ไฟล์ของฉัน
ไฟล์. txt

$ python3 myscript.py # ส่งคืนใน .09 วินาที
นี่คือเอาต์พุตของสคริปต์ Python

$ wget url # ไปเป็นเวลา 0.1 วินาที จากนั้นระบบปฏิบัติการก็ยกเลิก
กระบวนการยุติเนื่องจากจำกัดเวลา
user535733 avatar
cn flag
สำหรับฉันแล้ว นี่ดูเหมือนเป็น [คำถาม XY](https://en.wikipedia.org/wiki/XY_problem): แทนที่จะถามเกี่ยวกับปัญหา คุณกำลังถามถึงวิธีแก้ปัญหาที่ต้องการ คุณอาจได้รับความช่วยเหลือที่ดีขึ้นหากคุณถามเกี่ยวกับปัญหาพื้นฐานที่การจำกัดเวลาสากลดูเหมือนจะแก้ไขได้ คำสั่งจำนวนมากเกิดขึ้นเบื้องหลัง -- เวลาที่จำกัดอาจทำให้เดสก์ท็อปหรือการเชื่อมต่อเครือข่ายของคุณสิ้นสุดลงโดยไม่คาดคิด หรือมีผลกระทบอื่นๆ ที่ไม่คาดคิด
ar flag
ยินดีต้อนรับสู่ถาม Ubuntuโปรด[แก้ไขคำถามของคุณ](https://askubuntu.com/posts/1370992/edit) และเพิ่มข้อมูลเพิ่มเติมเกี่ยวกับปัญหาจริง distro และหมายเลขเวอร์ชันของ Linux ที่คุณใช้ คุณใช้เวอร์ชันเดสก์ท็อปหรือเซิร์ฟเวอร์
muru avatar
us flag
ตรวจสอบ `cpu` ใน [`limits.conf`](https://manpages.ubuntu.com/manpages/focal/man5/limits.conf.5.html)
sudodus avatar
jp flag
ดังนั้นจึงเป็นกระบวนการที่คุณเริ่มต้นเองและดูในหน้าจอข้อความ (บนคอนโซลหรือผ่าน ssh หรือสิ่งที่คล้ายกัน) เป็นเรื่องง่ายสำหรับคุณที่จะสังเกตว่าพวกเขากินเวลานานกว่าหนึ่งวินาทีหรือน้อยกว่าหนึ่งวินาทีหรือไม่ เริ่มต้นคำนำหน้าด้วยเวลา: `คำสั่งเวลา -พารามิเตอร์ตัวเลือก' คุณจะสังเกตเห็นว่าใช้เวลานานกว่าหนึ่งวินาทีหรือไม่ และคุณสามารถปิดได้ด้วยตนเอง หากสั้นกว่านั้น คุณจะได้รับคำสั่ง time used ที่พิมพ์ออกมา
in flag
@sudodus ขอบคุณสำหรับคำแนะนำของคุณ แต่ฉันขอโทษ นั่นไม่ใช่สิ่งที่ฉันกำลังพยายามทำ ฉันไม่ต้องค้นหาว่าใช้เวลานานเท่าใด ฉันต้องการหยุดไม่ให้ใช้เวลานานเกินกำหนดโดยอัตโนมัติ
sudodus avatar
jp flag
ฉันพยายามที่จะเข้าใจ แต่ไม่สำเร็จ โปรดอธิบายอีกครั้ง: มีกระบวนการที่เริ่มต้นโดยอัตโนมัติซึ่งทำงานอยู่เบื้องหน้าและพิมพ์บนหน้าจอหรือไม่ หรืออย่างอื่น? ฉันคิดว่าคุณต้องการค้นหาหรือพัฒนาคำสั่งที่เร็วพอและหลีกเลี่ยงคำสั่งที่ช้าเกินไป
in flag
ฉันเพิ่งเขียนด้านบนเกี่ยวกับ “กระบวนการในเบื้องหลัง” เพื่อหมายความว่า ไม่เป็นไรหากคอมพิวเตอร์กำลังทำกระบวนการบางอย่างที่ผู้ใช้ไม่ทราบ ซึ่งไม่จำเป็นต้องจำกัดเวลา ทุกอย่างที่เกิดขึ้นในเทอร์มินัลที่พรอมต์คำสั่งเป็นสิ่งที่ผู้ใช้ทำ ถ้าฉันป้อนคำสั่งลงในเชลล์ คำสั่งนั้นจะกลับมาก่อนเวลาที่กำหนด หรือถูกยกเลิกและกลับไปที่พรอมต์ก่อนเวลาที่กำหนด
sudodus avatar
jp flag
คุณสบายดีไหมหากกระบวนการปล่อยให้ไฟล์ที่เปิดอยู่เขียนบางส่วนและอาจเสียหาย
in flag
ฉันพร้อมที่จะสำรวจทุกสิ่งที่ทำให้เป็นไปได้ ดังนั้นหากจำเป็น ก็ใช่ ฉันสนใจ หากหลีกเลี่ยงไม่ได้ ฉันจะมองหาวิธีแก้ปัญหาในขณะที่ฉันดำเนินการเพิ่มเติมในเรื่องนี้
sudodus avatar
jp flag
ให้เรา [ดำเนินการสนทนาต่อในการแชท](https://chat.stackexchange.com/rooms/130782/discussion-between-sudodus-and-peter-elbert)
in flag
ได้เลย ฉันอยู่ตรงนั้น ขอบคุณ
Score:1
ธง jp

คำนำหน้าด้วย shellscript ตรวจสอบ

เชลล์สคริปต์ ตรวจสอบที่สามารถใช้นำหน้าบรรทัดคำสั่งใด ๆ อาจมีลักษณะดังนี้

#!/bin/bash

ถ้า [ "$1" == "--debug" ]
แล้ว
 แก้จุดบกพร่อง = จริง
 กะ
อื่น
 ดีบัก = เท็จ
ไฟ

"$@" & pid=$!
นอน 0.1 # ครั้ง (s) จนกว่าจะฆ่า
ฆ่า $pid 2> /dev/null
ความละเอียด = "$?"

ถ้า $debug
แล้ว
 ถ้า [ $res -eq 0 ]
 แล้ว
  echo "หมดเวลา: $@"
 อื่น
  echo "เสร็จสิ้นอย่างงดงาม: $@"
 ไฟ
ไฟ

ตัวอย่างที่ 1

$ ./check --debug bash -c "ในขณะที่จริง;ทำวันที่ '+%s.%N';sleep 0.01;done"
1634944386.589977656
1634944386.603126888
1634944386.616089924
1634944386.629058026
1634944386.642334480
1634944386.655644267
1634944386.668289318
1634944386.681058710
ถูกฆ่าเมื่อหมดเวลา: bash -c ในขณะที่ true;do date '+%s.%N';sleep 0.01;done

ตัวอย่างที่ 2

$ ./check --debug lsblk
ชื่อ MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 238,5G 0 ดิสก์ 
ââsda1 8:1 0 500M 0 ส่วน 
ââsda2 8:2 0 139,4G 0 ส่วน 
ââsda3 8:3 0 1000M 0 ส่วน 
ââsda4 8:4 0 1K 0 ส่วน 
ââsda5 8:5 0 89,7G 0 ส่วน /
ââsda6 8:6 0 8G 0 ส่วน [สลับ]
sdb 8:16 0 3,7T 0 ดิสก์ 
ââsdb1 8:17 0 510M 0 ส่วน 
ââsdb2 8:18 0 30G 0 ส่วน 
ââsdb5 8:21 0 1M 0 ส่วน 
ââsdb6 8:22 0 100G 0 ส่วน 
ââsdb7 8:23 0 3,5T 0 ส่วน /media/multimed-2
ââsdb8 8:24 0 5G 0 ส่วน 
sr0 11:0 1 1024M 0 รอม  
nvme0n1 259:0 0 232,9G 0 ดิสก์ 
âânvme0n1p1 259:1 0 232,9G 0 ส่วน 
âânvme0n1p2 259:2 0 1M 0 ส่วน 
จบอย่างงดงาม: lsblk

เชลล์แบบกำหนดเองดั้งเดิม ป.ล

อีกทางเลือกหนึ่งคือเชลล์โหมดบ้านดั้งเดิม ป.ล สามารถใช้เพื่อการนี้ได้เช่นกัน

  • ข้อดี: คุณสามารถเรียกใช้คำสั่งได้โดยตรงโดยไม่ต้องมีคำนำหน้าเพิ่มเติม

  • ข้อเสีย: คุณสามารถแก้ไขบรรทัดคำสั่งได้ แต่ไม่มีประวัติและคุณไม่สามารถเข้าถึงประวัติของเชลล์มาตรฐานได้ ตัวอย่างเช่น ทุบตี, zsh, tcsh`). คุณสมบัติอื่น ๆ ของเชลล์มาตรฐานยังขาดหายไปเช่นกัน

bash shellscript ป.ล และสคริปต์ python3 เข็มหมุด ควรทำให้สามารถเรียกใช้งานได้และคัดลอก ย้าย หรือเชื่อมโยงไปยังไดเร็กทอรีใน เส้นทาง, ตัวอย่างเช่น /usr/local/bin,

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

ป.ล,

#!/bin/bash

tmpf=$(mktemp)
ขมิ้น = "$ (pwd)"
cmd=
ในขณะที่จริง
ทำ
# อ่าน -p "psh:$curdir> " cmd 2>&1
# echo "$cmd" > "$tmpf"
 ปักหมุด "$curdir" "$tmpf"
#แมว "$tmpf"
 cmd=$(แมว "$tmpf")
 ถ้า [ "$cmd" != "ออก" ]
 แล้ว
  ถ้า [ "${cmd:0:3}" == "cd " ]
  แล้ว
   ที่มา "$tmpf"
   ขมิ้น = "$ (pwd)"
  อื่น
   แหล่งที่มา "$tmpf" & pid=$!
   นอน 0.1 # ครั้ง (s) จนกว่าจะฆ่า
   ฆ่า $pid 2> /dev/null
  ไฟ
 อื่น
  หยุดพัก
 ไฟ
เสร็จสิ้น 2> /dev/null
rm "$tmpf"

เข็มหมุด,

#!/usr/bin/python3

จาก sys นำเข้า argv
นำเข้า rlcompleter
นำเข้าอ่านไลน์
readline.parse_and_bind("แท็บ: สมบูรณ์")
พรอมต์ = 'psh:{0} > '.format(argv[1])

f = เปิด (argv [2], 'w')
cmd = อินพุต (พรอมต์)
f.write('{0}\n'.format(cmd)) # เขียนไปยังอาร์กิวเมนต์แรก

ตัวอย่าง:

sudodus@bionic64 /media/multimed-2/test/test0/temp/PeterElbert $ psh
psh:/media/multimed-2/test/test0/temp/PeterElbert > ในขณะที่จริง;ทำวันที่ '+.%N';sleep 0.008;done
.753302869
.763750113
.773720876
.783983502
.794652755
.805570413
.816651252
.827621482
.838553391
.849516607
psh:/media/multimed-2/test/test0/temp/PeterElbert > ls -l
รวม 12
-rwxrwxr-x 1 sudodus sudodus 282 okt 23 01:18 ตรวจสอบ
-rwxrwxr-x 1 sudodus sudodus 255 okt 23 07:18 พิน
-rwxrwxr-x 1 ซูโดดัส ซูโดดัส 438 ตกลง 23 07:51 psh
psh:/media/multimed-2/test/test0/temp/PeterElbert > ซีดี ..
psh:/media/multimed-2/test/test0/temp > ออก
sudodus@bionic64 /media/multimed-2/test/test0/temp/PeterElbert $ 

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา