Điểm:0

Làm cách nào tôi có thể đặt giới hạn thời gian chung cho bất kỳ thao tác dòng lệnh nào?

lá cờ in

Tôi muốn chỉ định ở đâu đó sâu trong hệ điều hành rằng bất kỳ lệnh dòng lệnh nào mất nhiều thời gian hơn một khoảng thời gian đã chỉ định sẽ tự động bị chấm dứt hoặc hủy bỏ và quay lại dấu nhắc trình bao.

Nó phải phổ biến và nằm sâu trong hệ thống đầu cuối để không ứng dụng nào khác có thể kiểm soát dòng lệnh và không bị ràng buộc bởi hạn chế.

Tôi có thể làm cái này như thế nào?

Lý do cụ thể mang tính cá nhân và nghe có vẻ kỳ lạ nếu tôi giải thích lý do nhưng mục tiêu rõ ràng là tôi không muốn bất kỳ quy trình dòng lệnh nào mất nhiều hơn một khoảng thời gian rất ngắn, lý tưởng là một phần mười giây hoặc điều gì đó dường như ngay lập tức. Tôi muốn thực thi máy tính của mình được xây dựng từ các quy trình ngắn và điều chỉnh tất cả các quy trình mà tôi cần thực hiện trong khoảng thời gian ngắn. Nếu một quy trình mất nhiều thời gian hơn thế, tôi phải tìm cách thay thế nó hoặc điều chỉnh hệ thống của mình theo một cách nào đó để làm cho nó đáp ứng giới hạn thời gian. Nếu có các quy trình đang diễn ra ở chế độ nền mà tôi không bao giờ phải xem hoặc nghĩ đến, điều đó không sao cả. Nó phải là các lệnh tôi thấy và đang thực hiện tại dấu nhắc trình bao.

Tôi muốn làm điều này trên Ubuntu Server, vì vậy tôi sẽ không chạy GUI. Tôi sử dụng 21.04 nhưng số phiên bản không quan trọng đối với tôi.

Như thế này:

$ ls # trả về sau 0,05 giây
Các tài liệu
Tệp của tôi
tập tin.txt

$ python3 myscript.py # trả về sau 0,09 giây
Đây là đầu ra của tập lệnh Python.

$ wget url # diễn ra trong 0,1 giây sau đó hệ điều hành đã chấm dứt nó
QUY TRÌNH ĐÃ CHẤM DỨT DO THỜI GIAN CÓ HẠN
user535733 avatar
lá cờ cn
Đối với tôi, đây giống như một [Câu hỏi XY](https://en.wikipedia.org/wiki/XY_problem): Thay vì hỏi về một vấn đề, bạn đang hỏi về một giải pháp ưu tiên. Bạn có thể nhận được trợ giúp tốt hơn nếu bạn hỏi về vấn đề cơ bản mà giới hạn thời gian chung dường như giải quyết được. Rất nhiều lệnh xảy ra ở hậu trường -- giới hạn thời gian có thể chấm dứt bất ngờ máy tính để bàn hoặc kết nối mạng của bạn hoặc có các tác động không mong muốn khác.
lá cờ ar
Chào mừng bạn đến với Hỏi Ubuntu.Vui lòng [chỉnh sửa câu hỏi của bạn](https://askubuntu.com/posts/1370992/edit) và thêm thông tin khác về vấn đề thực sự cũng như bản phân phối và số phiên bản Linux bạn đang sử dụng. Bạn đang sử dụng máy tính để bàn hoặc phiên bản máy chủ?
muru avatar
lá cờ us
Kiểm tra `cpu` trong [`limits.conf`](https://manpages.ubuntu.com/manpages/focal/man5/limits.conf.5.html).
sudodus avatar
lá cờ jp
Vì vậy, đó là các quy trình mà bạn tự bắt đầu và xem trên màn hình văn bản (trên bảng điều khiển hoặc qua ssh hoặc thứ gì đó tương tự). Bạn có thể dễ dàng nhận thấy nếu chúng tồn tại lâu hơn một giây hoặc ít hơn một giây. Bắt đầu chúng với tiền tố thời gian: `thông số tùy chọn -lệnh thời gian`. Bạn sẽ nhận thấy nếu chúng mất nhiều hơn một giây và bạn có thể tắt chúng theo cách thủ công. Nếu ngắn hơn, bạn sẽ nhận được thời gian sử dụng được in bởi lệnh time.
lá cờ in
@sudodus Cảm ơn đề xuất của bạn nhưng tôi xin lỗi, đó không phải là điều tôi đang cố gắng thực hiện. Tôi không cần biết nó mất bao lâu. Tôi muốn tự động ngăn không cho nó kéo dài hơn một thời gian nhất định.
sudodus avatar
lá cờ jp
Tôi đã cố gắng để hiểu nhưng không thành công. Vui lòng giải thích lại: Có quy trình nào được bắt đầu tự động, đang chạy ở nền trước và in ra màn hình không? Hay cái gì khác? Tôi nghĩ rằng bạn muốn tìm hoặc phát triển các lệnh đủ nhanh và tránh các lệnh quá chậm.
lá cờ in
Tôi vừa viết ở trên về "các quy trình trong nền" có nghĩa là, sẽ không sao nếu máy tính đang thực hiện một số quy trình mà người dùng không biết. Điều đó không cần phải giới hạn thời gian. Đó chỉ là mọi thứ xảy ra trong thiết bị đầu cuối, tại dấu nhắc lệnh, mà người dùng thực hiện. Nếu tôi nhập lệnh vào trình bao, lệnh đó sẽ quay lại trước thời hạn hoặc lệnh bị hủy và quay lại dấu nhắc trước thời hạn.
sudodus avatar
lá cờ jp
Bạn có ổn không nếu các quy trình để lại các tệp đã mở được ghi một phần và có thể bị hỏng?
lá cờ in
Tôi sẵn sàng khám phá bất cứ điều gì có thể, vì vậy nếu điều đó là cần thiết thì vâng, tôi rất quan tâm, nếu có thể tránh được, tôi có thể xem xét các cách khắc phục sự cố khi tôi tìm hiểu sâu hơn về vấn đề này.
sudodus avatar
lá cờ jp
Hãy để chúng tôi [tiếp tục cuộc thảo luận này trong cuộc trò chuyện](https://chat.stackexchange.com/rooms/130782/discussion-between-sudodus-and-peter-elbert).
lá cờ in
Chắc chắn, tôi ở đó. Cảm ơn
Điểm:1
lá cờ jp

Tiền tố với shellscript kiểm tra

shellscript kiểm tra, có thể được sử dụng để thêm tiền tố vào bất kỳ dòng lệnh nào có thể trông như thế này,

#!/bin/bash

nếu [ "$1" == "--debug" ]
sau đó
 gỡ lỗi = đúng
 sự thay đổi
khác
 gỡ lỗi = sai
fi

"$@" & pid=$!
ngủ 0,1 # lần (s) cho đến khi giết
giết $pid 2> /dev/null
độ phân giải = "$?"

nếu $ gỡ lỗi
sau đó
 nếu [ $res -eq 0 ]
 sau đó
  echo "bị giết khi hết thời gian chờ: $@"
 khác
  echo "đã hoàn thành một cách duyên dáng: $@"
 fi
fi

ví dụ 1

$ ./check --debug bash -c "while true;do date '+%s.%N';sleep 0.01;done"
1634944386.589977656
1634944386.603126888
1634944386.616089924
1634944386.629058026
1634944386.642334480
1634944386.655644267
1634944386.668289318
1634944386.681058710
bị giết khi hết thời gian chờ: bash -c while true;do date '+%s.%N';sleep 0.01;done

ví dụ 2

$ ./kiểm tra --debug lsblk
TÊN MAJ:KÍCH THƯỚC RM TỐI THIỂU RO LOẠI NÚI
sda 8:0 0 238,5G 0 đĩa 
ââsda1 8:1 0 500M 0 phần 
ââsda2 8:2 0 139,4G 0 phần 
ââsda3 8:3 0 1000M 0 phần 
ââsda4 8:4 0 1K 0 phần 
ââsda5 8:5 0 89,7G 0 phần /
ââsda6 8:6 0 8G 0 phần [SWAP]
sdb 8:16 0 3,7T 0 đĩa 
ââsdb1 8:17 0 510M 0 phần 
ââsdb2 8:18 0 30G 0 phần 
ââsdb5 8:21 0 1M 0 phần 
ââsdb6 8:22 0 100G 0 phần 
ââsdb7 8:23 0 3,5T 0 phần /media/multimed-2
ââsdb8 8:24 0 5G 0 phần 
sr0 11:0 1 1024M 0 phòng  
nvme0n1 259:0 0 232,9G 0 đĩa 
âânvme0n1p1 259:1 0 232,9G 0 phần 
âânvme0n1p2 259:2 0 1M 0 phần 
hoàn thành một cách duyên dáng: lsblk

Vỏ tùy chỉnh nguyên thủy psh

Một giải pháp thay thế khác, shell chế độ nhà nguyên thủy psh cũng có thể được sử dụng cho mục đích này.

  • Ưu điểm: Bạn có thể chạy các lệnh trực tiếp mà không cần thêm bất kỳ tiền tố nào.

  • Nhược điểm: Bạn có thể chỉnh sửa dòng lệnh, nhưng không có lịch sử và bạn không có quyền truy cập vào lịch sử của trình bao tiêu chuẩn chẳng hạn đánh đập, zsh, tcsh`). Một số tính năng khác của vỏ tiêu chuẩn cũng bị thiếu.

shellscript bash psh và tập lệnh python3 ghim nên được thực thi và sao chép, di chuyển hoặc liên kết vào một thư mục trong CON ĐƯỜNG, Ví dụ /usr/local/bin,

Bắt đầu psh, chạy các lệnh và thoát khỏi nó với lối ra. Đầu vào được quản lý bởi ghim, Sử dụng dòng đọc để có thể chỉnh sửa dòng lệnh (cao cấp hơn dòng lệnh tích hợp sẵn đọc của đánh đập).

psh,

#!/bin/bash

tmpf=$(mktemp)
sữa chua = "$ (pwd)"
cmd=
trong khi đúng
làm
# đọc -p "psh:$curdir> " cmd 2>&1
# tiếng vang "$cmd" > "$tmpf"
 ghim "$curdir" "$tmpf"
# con mèo "$tmpf"
 cmd=$(mèo "$tmpf")
 nếu [ "$cmd" != "thoát" ]
 sau đó
  nếu [ "${cmd:0:3}" == "cd " ]
  sau đó
   nguồn "$tmpf"
   sữa chua = "$ (pwd)"
  khác
   nguồn "$tmpf" & pid=$!
   ngủ 0,1 # lần (s) cho đến khi giết
   giết $pid 2> /dev/null
  fi
 khác
  nghỉ
 fi
xong 2> /dev/null
rm "$tmpf"

ghim,

#!/usr/bin/python3

từ nhập sys argv
nhập rlcompleter
nhập đường đọc
readline.parse_and_bind("tab: hoàn thành")
dấu nhắc = 'psh:{0} > '.format(argv[1])

f = mở(argv[2], 'w')
cmd = đầu vào (dấu nhắc)
f.write('{0}\n'.format(cmd)) # ghi vào đối số đầu tiên

Ví dụ:

sudodus@bionic64 /media/multimed-2/test/test0/temp/PeterElbert $ psh
psh:/media/multimed-2/test/test0/temp/PeterElbert > while true;do date '+.%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
tổng cộng 12
-rwxrwxr-x 1 sudodus sudodus 282 okt 23 01:18 kiểm tra
-rwxrwxr-x 1 sudodus sudodus 255 okt 23 07:18 pin
-rwxrwxr-x 1 sudodus sudodus 438 okt 23 07:51 psh
psh:/media/multimed-2/test/test0/temp/PeterElbert > cd ..
psh:/media/multimed-2/test/test0/temp > thoát
sudodus@bionic64 /media/multimed-2/test/test0/temp/PeterElbert $ 

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.