ටර්මිනලයේ සෑම x කාල පරතරයක්ම විධානයක් නැවත කරන්න?


157

නාමාවලි පරික්ෂා කිරීම හෝ අධීක්ෂණය කිරීම සඳහා විධාන ක්‍රියාත්මක කිරීමට මට ඉඩ සලසන පරිදි, සෑම කාල පරාසයකම විධානයක් නැවත කරන්නේ කෙසේද ?

ස්ක්‍රිප්ටයක් අවශ්‍ය නැත, ටර්මිනලයේ ක්‍රියාත්මක කිරීමට මට සරල විධානයක් අවශ්‍යය.

Answers:


232

ඔබට watchවිධානය භාවිතා කළ හැකිය , ඕනෑම නියම කරන ලද විධානයක් නියමිත වේලාවට ධාවනය කිරීම සඳහා ඔරලෝසුව භාවිතා කරයි.

පර්යන්තය විවෘත කර ටයිප් කරන්න:

watch -n x <your command>

x ඔබට අවශ්‍ය තත්පර කිහිපය ලෙස වෙනස් කරන්න.

watchවිධානය සහ එහි විකල්ප භාවිතා කරමින් වැඩි උදව් සඳහා, man watchමෙම සබැඳිය ධාවනය කරන්න හෝ පිවිසෙන්න .

උදාහරණයක් ලෙස: පහත දැක්වෙන්නේ සෑම 60 දශකයකම එකම පර්යන්තයේ ඩෙස්ක්ටොප් නාමාවලියෙහි අන්තර්ගතය වන අතර එමඟින් යම් වෙනසක් සිදුවී ඇත්දැයි ඔබට දැනගත හැකිය:

watch -n 60 ls -l ~/Desktop

36
+1 නමුත් පුළුල් කිරීම් භාවිතා කිරීමේදී ප්‍රවේශම් වන්න. නිදසුනක් ලෙස, ඔබේ පර්යන්තය ප්‍රතිනිර්මාණය කිරීමේදී watch -n 1 'echo $COLUMNS'සහ අතර වෙනස උත්සාහ කරන්න watch -n 1 echo $COLUMNS- කලින් සෑම තත්පරයකම පුළුල් වේ, නමුත් දෙවැන්න පුළුල් වන්නේ ආරම්භ වීමට පෙර එක් වරක් පමණි watch.
l0b0

මෙම විසඳුම සමඟ මට ඇති ගැටළුව නම්, ඔබට ක්‍රියාවලියක් ලෙස ඔරලෝසුව ධාවනය කළ නොහැකි අතර එය පසුබිමේ ධාවනය කර තැබීම පමණි (නිදසුනක් ලෙස සහ නොසලකා
හැරීම

2
watch"ඉතිහාසය සක්‍රීය" වර්ගයේ විධානය සමඟ භාවිතා කිරීමට ක්‍රමයක් තිබේද? මම භාවිතා කිරීමට watchකැමතියි, නමුත් සමහර විට මම අන්තිම ක්‍රියාව වෙනුවට පෙර මරණ ද of ුවම පිළිබඳ ලොගයක් දැකීමට කැමැත්තෙමි. ඔව්, මම දන්නවා while trueමෙය ඉටු කිරීම සඳහා මට ස්ක්‍රිප්ටින් ( ) භාවිතා කළ හැකි බව , නමුත් watchඋපයෝගීතාව භාවිතා කිරීම එතරම් පිරිසිදුයි!
රිනෝගෝ

මෙය සරල විධාන සඳහා වැඩ කළ නමුත් නල මාර්ගයෙන් දම්වැල් දම්වැලකින් බැඳීම මට වැඩ කළේ නැත .. මම උත්සාහ කළ විධානය පහත දැක්වේ => cat api.log | grep 'call' | wc -l
සුදීප් භන්දාරි

1
-bash: watch: command not found, macOS 10.14.1
අභිජිත් සර්කාර්

98

නූක්ස්ගේ පිළිතුරට අමතරව ඔබට මෙම විධානය ටර්මිනලයේ භාවිතා කළ හැකිය:

while true; do <your_command>; sleep <interval_in_seconds>; done

උදාහරණයක්

while true; do ls; sleep 2; done

මෙම විධානය lsතත්පර 2 ක පරතරයකින් ප්‍රතිදානය මුද්‍රණය කරයි.

ක්‍රියාවලිය නැවැත්වීමට Ctrl+ භාවිතා කරන්න C.

එහි අඩුපාඩු කිහිපයක් තිබේ watch

  • එයට අන්වර්ථ විධාන භාවිතා කළ නොහැක.
  • කිසියම් විධානයක ප්‍රතිදානය තරමක් දිගු නම්, අනුචලනය නිසි ලෙස ක්‍රියා නොකරයි.
  • නිශ්චිත අගයෙන් ඔබ්බට උපරිම කාල පරතරය සැකසීමට යම් ගැටළුවක් ඇත .
  • watchගැලවීමේ අක්ෂර පසුකර යන -cහෝ --colorවිකල්පයක් භාවිතා කරමින් ANSI වර්ණ අනුක්‍රමය අර්ථ නිරූපණය කරයි . උදාහරණයක් ලෙස ප්‍රතිදානය pygmentizeක්‍රියා කරන නමුත් එය අසාර්ථක වනු ඇත ls --color=auto.

ඉහත තත්වයන් තුළ මෙය වඩා හොඳ විකල්පයක් ලෙස පෙනෙන්නට පුළුවන.


watchපවතින සඳහා, මම මේ කියන්න යන ටිකක් ද නිෂ්ඵල
බෲනෝ පෙරෙයිරා

14
මෙම පිළිතුර මුලින් භාවිතා කළ යුතු යැයි මම නොකියමි. watchබොහෝ අවස්ථාවලදී හොඳයි. මා මුලින් “නූක්ස්ගේ පිළිතුරට අමතරව” සඳහන් කළේ එබැවිනි. නමුත් ගැටළු කිහිපයක් ඇත watch. උදාහරණයක් ලෙස කෙනෙකුට අන්වර්ථ විධාන භාවිතා කළ නොහැකwatch . llඅන්වර්ථ වී ඇති ls -laFනමුත් භාවිතා කළ නොහැකි උදාහරණයක් ගන්න watch. යම් විධානයක ප්‍රතිදානය තරමක් දිගු නම් ඔබට අනුචලනය කිරීමේදී කරදරයක් වනු ඇත watch. මෙම විශේෂ අවස්ථා කිහිපය තුළ මෙම පිළිතුර වඩා හොඳ විකල්පයක් ලෙස පෙනේ.
souravc

ououravc watchඅවම වශයෙන් මගේ අනුවාදය වර්ණවත් කළ නිමැවුම් සඳහා -cහෝ --colorවිකල්ප වලට ඉඩ දෙයි .
ලිලී චුන්ග්

8
while sleep xවඩා හොඳයි - මරා දැමීම පහසුය.
d33tah

4
මෙය කදිම විකල්පයක් වන අතර watch, එය මෙන් නොව , එය විධාන ඉතිහාසය තබා ගනී.
adelriosantiago

37

යන්තම් වෙත තණතීරුව කිරීමට අවශ්ය souravc හා nux ගේ පිළිතුරු:

  1. watchඋබුන්ටු මත පරිපූර්ණව ක්‍රියා කරන අතරම , ඔබේ "යුනික්ස්-ෆු" පිරිසිදු වීමට අවශ්‍ය නම් එය වළක්වා ගැනීමට ඔබට අවශ්‍ය වනු ඇත - නිදසුනක් ලෙස FreeBSD හි ඔරලෝසුව යනු "වෙනත් ටයිටි රේඛාවක් දෙස බැලීමට" විධානයකි.
  2. while true; do command; sleep SECONDS; doneඔබේ අවවාදය CTR + C භාවිතා කර මරා දැමීමට අපහසු විය හැකිය . ඔබට කැමති වීමට අවශ්‍ය විය හැකිය while sleep SECONDS; do command; done- එය කෙටි පමණක් නොව බාධා කිරීම පහසුය. අවවාදය නම්, එය පළමුව නිදාගෙන, පසුව ඔබේ විධානය ක්‍රියාත්මක කරන්න, එබැවින් SECONDSපළමු විධානය සිදුවීමට පෙර ඔබ ටිකක් බලා සිටිය යුතුය .

2
අදහස් දැක්වීමක් වෙනුවට පිළිතුරක් ලෙස එය පිළිගත හැකි යැයි සිතමි - මට මෙහි තවත් විසඳුමක් පෙන්වීමට අවශ්‍ය වූ අතර අදහස් දැක්වීම ඇත්තෙන්ම මට අඩු අවධානයක් ලබා දෙනු ඇත.
d33tah

ඇයි ඔබ දමා කැපිය එය වැදගත්ද sleepතුළ whileපුඩුවක්? මට කිසිදු වෙනසක් සොයාගත නොහැකි විය, Ctrl + C කුමක් වුවත් ක්‍ෂණිකව ලූපය බිඳ දැමීය .
අතුරුපස

essdessert: රඳා පවතින්නේ ඔබ අනුමාන කිරීමට උත්සාහ කරන දේ මතය. සාමාන්යයෙන්, ctrl + c ඔබගේ මරා දමනු ඇතැයි commandsleepසහ එකම ඔබ මැරුවොත් බිඳ true.
d33tah

11

cronආවර්තිත විධාන ක්‍රියාත්මක කිරීමට ඉඩ සලසන ඩීමන් සඳහා කදිම කාර්යයක් ලෙස පෙනේ. crontab -eඔබේ පරිශීලකයාගේ ක්‍රෝන් වින්‍යාසය සංස්කරණය කිරීම ආරම්භ කිරීමට විධානය ක්‍රියාත්මක කරන්න . එහි ආකෘතිය crontab (5) හි ලේඛනගත කර ඇත . මූලික වශයෙන් ඔබට කාලයට සම්බන්ධ, අවකාශයෙන් වෙන් වූ ක්ෂේත්‍ර පහක් ඇත, ඉන්පසු විධානයක් ඇත:

The time and date fields are:

       field          allowed values
       -----          --------------
       minute         0-59
       hour           0-23
       day of month   1-31
       month          1-12 (or names, see below)
       day of week    0-7 (0 or 7 is Sunday, or use names)

උදාහරණයක් ලෙස, සෑම අඟහරුවාදා දිනකම පයිතන් පිටපතක් ධාවනය කිරීමට ඔබ කැමති නම්, පෙ.ව. 11:

0 11 * * 1 python ~/yourscript.py

කාලය වෙනුවට ආදේශ කරන විශේෂ නම් කිහිපයක් ද @rebootඇත. ඔබට තාවකාලික නාමාවලියක් සෑදීමට අවශ්‍ය නම් ඉතා ප්‍රයෝජනවත් වේ. මගේ crontab වෙතින් (සමඟ ලැයිස්තුගත කර ඇත crontab -l):

# Creates a temporary directory for ~/.distcc at boot
@reboot ln -sfn "$(mktemp -d "/tmp/distcc.XXXXXXXX")" "$HOME/.distcc"

5
වරින් වර පර්යන්තය තුළ යමක් ධාවනය කරන්නේ කෙසේදැයි ප්‍රශ්නය අසයි. cronපර්යන්තයට වඩා තිරය පිටුපස දිව යයි
උතුරු බ්‍රැඩ්ලි

5

ඔබ ගොනු පද්ධතිය අධීක්ෂණය කරන්නේ නම්, inotifywaitඑය දීප්තිමත් වන අතර නිසැකවම ඔබේ පද්ධතියට අඩු බරක් එක් කරයි.

උදාහරණයක් :

දී 1 වන පර්යන්තයේ මෙම විධානය යතුරු කරන්න:

$ inotifywait .

ඉන් පසුව 2 වන පර්යන්තයේ, වත්මන් බහාළුම බලපාන විධාන,

$ touch newfile

එවිට මුල් පර්යන්තයේ inotifywait අවදි වී සිද්ධිය වාර්තා කරනු ඇත

./ CREATE newfile2

නැත්නම් ලූපයක

$ while true ; do inotifywait . ; done
Setting up watches.  
Watches established.
./ OPEN newfile2
Setting up watches.  
Watches established.
./ OPEN newfile2
Setting up watches.  
Watches established.
./ DELETE newfile
Setting up watches.  
Watches established.
./ CREATE,ISDIR newdir
Setting up watches.  
Watches established.

පරිශීලකයා ඔබට පැවසුවා, පිටපතක් නැත, සමහර විට ඔහුට කිසිවක් නිරීක්ෂණය කිරීමට අවශ්‍ය නොවනු ඇත
nux

3
මම ඔහුට ස්ක්‍රිප්ට් එකක් ලිවීමට කීවේ නැත, මම යෝජනා කළේ ඒවා විශේෂිත ගොනු පද්ධති සිදුවීමක් නැරඹීම සඳහා අක්‍රීයව ලූපයක් නම්, inotifywait ප්‍රයෝජනවත් වන අතර විධානයක් පුනරාවර්තනය කිරීමට වඩා අඩු සම්පත් භාවිතා කරන බවයි. මම බොහෝ විට විධාන රේඛාවක විධාන කිහිපයක් ධාවනය කරමි. උදා: grep something InALogFile|lessඑය ස්ක්‍රිප්ට් එකක් ද?
X Tian

එය හොඳ පිළිතුරකි, වඩාත් සරල පෙනුමක් සඳහා එය සංස්කරණය කිරීමට උත්සාහ කරන්න.
nux

3
.මට වඩා සරල විය හැකි දේ මට විධානයෙන් ඉවත් කළ නොහැක.
X Tian

ස්තූතියි @XTian, ​​නියම විධානයක්. -mපුඩුවක් නොමැතිව නිරන්තරයෙන් අධීක්ෂණය කිරීම සඳහා ඔබට එකතු කළ හැකි බව මම දැන් man පිටුවේ දුටුවෙමි .
yoniLavi

4

repeatපහත දැක්වෙන පියවරයන් අනුගමනය කරමින් ඔබට ඔබේම විධානයක් නිර්මාණය කළ හැකිය ; මෙහි බැර :

පළමුව, ඔබේ .bash_aliasesගොනුව විවෘත කරන්න :

$ xdg-open ~/.bash-aliases

දෙවනුව, මෙම රේඛා ගොනුවේ පතුලේ අලවා සුරකින්න:

repeat() {
n=$1
shift
while [ $(( n -= 1 )) -ge 0 ]
do
    "$@"
done
}

තෙවනුව, ඔබේ පර්යන්තය වසා නැවත විවෘත කරන්න, නැතහොත් ටයිප් කරන්න:

$ source ~/.bash_aliases

සහ වොයිලා! ඔබට දැන් එය මේ ආකාරයෙන් භාවිතා කළ හැකිය:

$ repeat 5 echo Hello World !!!

හෝ

$ repeat 5 ./myscript.sh

xdg-open ~ / .bash-අන්වර්ථ රේඛාවේ කුඩා අක්ෂර වින්‍යාසයක් ඇත. එය විය යුත්තේ: xdg-open ~ / .bash_aliases (එනම්: අවධාරනය කරන්න)
ssinfod

4

ඔබට ක්‍රොන්ටාබ් භාවිතා කළ හැකිය. විධානය ක්‍රියාත්මක crontab -eකර ඔබ කැමති පෙළ සංස්කාරකය සමඟ එය විවෘත කරන්න, ඉන්පසු මෙම පේළිය එක් කරන්න

*/10 * * * *  /path-to-your-command

මෙය සෑම විනාඩි 10 කට වරක් ඔබේ විධානය ක්‍රියාත්මක කරයි

* */4 * * *  /path-to-your-command

මෙය සෑම පැය 4 කට වරක් ඔබේ විධානය ක්‍රියාත්මක කරයි

හැකි තවත් විසඳුමක්

$ ..some command...; for i in $(seq X); do $cmd; sleep Y; done

පුනරාවර්තනය කිරීමට X වාර ගණන.

Y නැවත බලා සිටීමට කාලය.

උදාහරණයක් :

$ echo; for i in $(seq 5); do $cmd "This is echo number: $i"; sleep 1;done

මෙය වැඩිදියුණු වන්නේ ඇයි? විධානය විචල්‍යයක් ලෙස සුරැකීමෙන් ඔබ අමතර, අනවශ්‍ය පියවරක් එක් කළේය. මෙය කළ හැකි එකම දෙය නම් i) ටයිප් කිරීමට වැඩි කාලයක් ගත කිරීම) සරල විධානයන් පමණක් භාවිතා කිරීමට ඔබට බල කරයි, පයිප්ප හෝ යළි-යොමුවීම් ආදිය.
terdon

අමතර විචල්‍යය ඉවත් කරන්න
Maythux

3

ඉහත යෝජනා කර ඇති "ඔරලෝසු" ප්‍රවේශය පිළිබඳ තවත් කරුණක් නම්, එය ප්‍රති result ලය පෙන්වන්නේ ක්‍රියාවලිය සිදු වූ විට පමණි. "දිනය; නින්ද 58; දිනය" මඟින් දින 2 දර්ශනය වන්නේ තත්පර 59 කට පසුව පමණි ... ඔබ විනාඩි 4 ක් ධාවනය වන දෙයක් ආරම්භ කරන්නේ නම්, එය සෙමින් බහුවිධ අන්තර්ගතයන් පෙන්වන, ඔබට එය සැබවින්ම නොපෙනේ.

අනෙක් අතට, “අතර” ප්‍රවේශය කෙරෙහි ඇති සැලකිල්ල නම්, එය කාර්ය කාලය සැලකිල්ලට නොගැනීමයි.

while true; do script_that_take_between_10s_to_50s.sh; sleep 50; done

මේ සමඟ, ස්ක්‍රිප්ට් සෑම මිනිත්තුවකම ක්‍රියාත්මක වේ, සමහර විට 1m40 ක් ගතවනු ඇත. එබැවින් සෑම මිනිත්තුවකටම ක්‍රෝන් එකකට එය ධාවනය කළ හැකි වුවද, මෙහි එය සිදු නොවේ.

එබැවින් කවචයේ ප්‍රතිදානය ජනනය වී ඇති ආකාරය දැක බලා නිශ්චිත ඉල්ලීම් කාලය එනතෙක් බලා සිටීමට නම්, ඔබට පෙර සහ පසු වේලාව දෙස බැලිය යුතු අතර වේලාව සමඟ ලූපය.

වැනි දෙයක්:

while ( true ); do
  echo Date starting `date`
  before=`date +%s`
  sleep `echo $(( ( RANDOM % 30 )  + 1 ))`
  echo Before waiting `date`
  after=`date +%s`
  DELAY=`echo "60-($after-$before)" | bc`
  sleep $DELAY
  echo Done waiting `date`
done

මෙය මෙය ප්‍රතිදානය කරයි:

ඔබට පෙනෙන පරිදි, විධානය සෑම මිනිත්තුවකම ක්‍රියාත්මක වේ:

Date starting Mon Dec 14 15:49:34 EST 2015
Before waiting Mon Dec 14 15:49:52 EST 2015
Done waiting Mon Dec 14 15:50:34 EST 2015

Date starting Mon Dec 14 15:50:34 EST 2015
Before waiting Mon Dec 14 15:50:39 EST 2015
Done waiting Mon Dec 14 15:51:34 EST 2015

එබැවින් "නින්ද echo $(( ( RANDOM % 30 ) + 1 ))" විධානය ඔබට අවශ්‍ය ඕනෑම දෙයක් සමඟ ප්‍රතිස්ථාපනය කරන්න . එය සෑම මිනිත්තුවකම ටර්මිනලය / කවචය මත ක්‍රියාත්මක වේ. ඔබට වෙනත් කාලසටහනක් අවශ්‍ය නම්, තත්පර 60 ක් ඔබට අවශ්‍ය දේ සමඟ වෙනස් කරන්න.

දෝශ නිරාකරණ රේඛා නොමැතිව කෙටි අනුවාදය:

while ( true ); do
  before=`date +%s`
  sleep `echo $(( ( RANDOM % 30 )  + 1 ))` # Place you command here
  after=`date +%s`
  DELAY=`echo "60-($after-$before)" | bc`
  sleep $DELAY
done

මට පිළිතුරු දීම ... ඔබේ විධානය ඔබ වින්‍යාස කරන ප්‍රමාදයට වඩා වැඩි කාලයක් ගත වුවහොත්, $ DELAY ට negative ණ අගයක් ලැබෙනු ඇති අතර නින්ද විධානය අසමත් වන බැවින් ස්ක්‍රිප්ට් එක වහාම නැවත ආරම්භ වේ. ඒ ගැන දැනුවත් විය යුතුයි.
jmspaggi
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.