Puncte:0

Cum aș putea seta o limită de timp universală pentru orice operație de linie de comandă?

drapel in

Aș dori să precizez undeva în adâncul sistemului de operare că orice comandă din linia de comandă care durează mai mult decât o anumită perioadă de timp ar trebui să fie automat terminată sau anulată și să revină la promptul shell.

Trebuie să fie universal și adânc în sistemul terminal, astfel încât nicio altă aplicație să nu poată prelua controlul asupra liniei de comandă și să nu fie legată de restricție.

Cum pot face acest lucru?

Motivul specific este personal și ar suna ciudat dacă aș explica de ce, dar obiectivul explicit este că nu vreau ca niciun proces din linia de comandă să dureze mai mult decât o perioadă foarte scurtă de timp, în mod ideal o zecime de secundă sau ceva aparent imediat. Vreau să-mi impun ca calculul să fie construit din procese scurte și să adaptez toate procesele pe care trebuie să le fac la perioade scurte de timp. Dacă un proces durează mai mult decât atât, trebuie să găsesc o modalitate de a-l înlocui sau de a-mi adapta sistemul într-un fel pentru a-l face să respecte limita de timp. Dacă există procese care se desfășoară în fundal la care nu trebuie să mă uit niciodată sau la care să mă gândesc, este în regulă. Ar trebui să fie comenzile pe care le văd și le execut la promptul shell.

Vreau să fac asta pe Ubuntu Server, așa că nu voi rula o interfață grafică. Folosesc 21.04, dar numărul versiunii nu este important pentru mine.

Ca aceasta:

$ ls # revine în 0,05 secunde
Documente
Fișierele mele
fișier.txt

$ python3 myscript.py # revine în 0,09 secunde
Aceasta este rezultatul scriptului Python.

$ wget url # a durat .1 secunde, după care sistemul de operare a terminat-o
PROCESUL TERMINAT DIN TIMPUL LIMITĂ
user535733 avatar
drapel cn
Pentru mine, aceasta arată ca o [Întrebare XY](https://en.wikipedia.org/wiki/XY_problem): În loc să întrebați despre o problemă, întrebați despre o soluție preferată. Este posibil să obțineți ajutor mai bun dacă întrebați despre problema de bază pe care o limită de timp universală pare să o rezolve. O mulțime de comenzi apar în spatele scenei -- o limită de timp ar putea întrerupe în mod neașteptat desktopul sau conexiunea la rețea sau poate avea alte efecte neașteptate.
drapel ar
Bun venit la Ask Ubuntu.Vă rugăm să [editați întrebarea](https://askubuntu.com/posts/1370992/edit) și adăugați mai multe informații despre problema reală și numărul de distribuție și versiunea Linux pe care o utilizați. Folosești versiunea desktop sau server?
muru avatar
drapel us
Verificați `cpu` în [`limits.conf`](https://manpages.ubuntu.com/manpages/focal/man5/limits.conf.5.html).
sudodus avatar
drapel jp
Deci, procesele sunt pe care le porniți singur și le priviți într-un ecran text (pe consolă sau prin ssh sau ceva similar). Este simplu pentru tine să observi dacă durează mai mult de o secundă sau mai puțin de o secundă. Porniți-le prefixate cu timp: `time command -options parameters`. Veți observa dacă durează mai mult de o secundă și le puteți opri manual. Dacă este mai scurt, veți obține timpul utilizat imprimat de comanda time.
drapel in
@sudodus Mulțumesc pentru sugestie, dar îmi pare rău, nu asta încerc să fac. Nu trebuie să aflu cât timp a durat. Vreau să-l împiedic să treacă mai mult de un anumit timp, automat.
sudodus avatar
drapel jp
Am încercat să înțeleg, dar nu am reușit. Vă rugăm să explicați din nou: Există procese care sunt pornite automat, care rulează în prim-plan și se imprimă pe ecran? Sau altceva? M-am gândit că doriți să găsiți sau să dezvoltați comenzi suficient de rapide și să evitați comenzile prea lente.
drapel in
Tocmai am scris mai sus despre âprocese în fundalâ pentru a însemna, este în regulă dacă computerul efectuează un proces de care utilizatorul nu este conștient. Nu trebuie să fie limitat în timp. Utilizatorul face doar tot ceea ce se întâmplă în terminal, la promptul de comandă. Dacă introduc o comandă în shell, aceasta revine înainte de limita de timp sau este anulată și revine la prompt înainte de limita de timp.
sudodus avatar
drapel jp
Este în regulă pentru tine dacă procesele lasă fișiere deschise parțial scrise și poate corupte?
drapel in
Sunt deschis să explorez orice face posibilă, așa că, dacă acest lucru este necesar, da, sunt interesat, dacă este posibil, pot căuta modalități de remediere a problemelor pe măsură ce merg mai departe.
sudodus avatar
drapel jp
Să [continuăm această discuție în chat](https://chat.stackexchange.com/rooms/130782/discussion-between-sudodus-and-peter-elbert).
drapel in
Sigur, sunt acolo. Mulțumiri
Puncte:1
drapel jp

Prefix cu shellscript Verifica

shellscript-ul Verifica, care poate fi folosit pentru a prefix orice linie de comandă poate arăta astfel,

#!/bin/bash

if [ "$1" == "--debug" ]
atunci
 depanare=adevărat
 schimb
altfel
 depanare=false
fi

„$@” și pid=$!
dormi 0,1 # timp (e) până la ucidere
kill $pid 2> /dev/null
res="$?"

dacă $debug
atunci
 dacă [ $res -eq 0 ]
 atunci
  echo "ucis la expirarea timpului: $@"
 altfel
  echo „terminat cu grație: $@”
 fi
fi

Exemplul 1

$ ./check --debug bash -c „în timp ce este adevărat; face data „+%s.%N”;sleep 0,01;terminat”
1634944386.589977656
1634944386.603126888
1634944386.616089924
1634944386.629058026
1634944386.642334480
1634944386.655644267
1634944386.668289318
1634944386.681058710
ucis la expirarea timpului: bash -c în timp ce este adevărat;dată „+%s.%N”;sleep 0,01;terminat

Exemplul 2

$ ./check --debug lsblk
NUME MAJ:MIN RM DIMENSIUNE RO TIP PUNCT DE MONTARE
sda 8:0 0 238,5G 0 disc 
ââsda1 8:1 0 500M 0 parte 
ââsda2 8:2 0 139,4G 0 parte 
ââsda3 8:3 0 1000M 0 parte 
ââsda4 8:4 0 1K 0 parte 
ââsda5 8:5 0 89,7G 0 parte /
ââsda6 8:6 0 8G 0 parte [SWAP]
sdb 8:16 0 3,7T 0 disc 
ââsdb1 8:17 0 510M 0 parte 
ââsdb2 8:18 0 30G 0 parte 
ââsdb5 8:21 0 1M 0 parte 
ââsdb6 8:22 0 100G 0 parte 
ââsdb7 8:23 0 3,5T 0 part /media/multimed-2
ââsdb8 8:24 0 5G 0 parte 
sr0 11:0 1 1024M 0 rom  
nvme0n1 259:0 0 232,9G 0 disc 
âânvme0n1p1 259:1 0 232,9G 0 parte 
âânvme0n1p2 259:2 0 1M 0 parte 
terminat cu grație: lsblk

Shell personalizat primitiv psh

O altă alternativă, un shell primitiv în modul acasă psh poate fi folosit și în acest scop.

  • Avantaj: Puteți rula comenzile direct fără niciun prefix suplimentar.

  • Dezavantaje: Puteți edita linia de comandă, dar nu există istoric și nu aveți acces la istoricul unui shell standard, de exemplu bash, zsh, tcsh`). Lipsesc și alte câteva caracteristici ale carcasei standard.

Scriptul shell bash psh și scriptul python3 pin ar trebui să fie executabil și copiat, mutat sau legat într-un director în CALE, de exemplu /usr/local/bin,

start psh, rulați comenzi și ieșiți din el cu Ieșire. Intrarea este gestionată de pin, care folosește Citeste linia pentru a face posibilă editarea liniei de comandă (mai avansată decât comanda încorporată citit de bash).

psh,

#!/bin/bash

tmpf=$(mktemp)
curdir="$(pwd)"
cmd=
în timp ce adevărat
do
# citește -p "psh:$curdir> " cmd 2>&1
# echo „$cmd” > „$tmpf”
 PIN „$curdir” „$tmpf”
# pisică „$tmpf”
 cmd=$(cat „$tmpf”)
 if [ "$cmd" != "ieșire" ]
 atunci
  dacă [ "${cmd:0:3}" == "cd " ]
  atunci
   sursa „$tmpf”
   curdir="$(pwd)"
  altfel
   sursa "$tmpf" & pid=$!
   dormi 0,1 # timp (e) până la ucidere
   kill $pid 2> /dev/null
  fi
 altfel
  pauză
 fi
terminat 2> /dev/null
rm "$tmpf"

pin,

#!/usr/bin/python3

din sys import argv
import rlcompleter
import readline
readline.parse_and_bind("fila: complet")
prompt = 'psh:{0} > '.format(argv[1])

f = deschis(argv[2], 'w')
cmd = intrare (prompt)
f.write('{0}\n'.format(cmd)) # scrie la primul argument

Exemplu:

sudodus@bionic64 /media/multimed-2/test/test0/temp/PeterElbert $ psh
psh:/media/multimed-2/test/test0/temp/PeterElbert > în timp ce este adevărat;do data „+.%N”;sleep 0,008;terminat
.753302869
.763750113
.773720876
.783983502
.794652755
.805570413
.816651252
.827621482
.838553391
.849516607
psh:/media/multimed-2/test/test0/temp/PeterElbert > ls -l
total 12
-rwxrwxr-x 1 sudodus sudodus 282 oct 23 01:18 verifica
-rwxrwxr-x 1 sudodus sudodus 255 oct 23 07:18 pin
-rwxrwxr-x 1 sudodus sudodus 438 oct 23 07:51 psh
psh:/media/multimed-2/test/test0/temp/PeterElbert > cd ..
psh:/media/multimed-2/test/test0/temp > ieșire
sudodus@bionic64 /media/multimed-2/test/test0/temp/PeterElbert $ 

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.