- Repeat command automatically in Linux
- 14 Answers 14
- Output :-
- Использование timeout в Linux с примерами
- Как взять timeout — об использовании команды
- Базовый синтаксис
- Сообщение с космосом или отправка определенного сигнала исполняемому процессу
- Как убить процесс, если он завис
- Сохраняем статус
- Запуск команды явно, а не за кулисами
- Заключение
Repeat command automatically in Linux
to check if the file size is increasing. I would like to have a command to have this repeat automatically.
14 Answers 14
If you wish to have visual confirmation of changes, append —differences prior to the ls command.
According to the OSX man page, there’s also
The —cumulative option makes highlighting «sticky», presenting a running display of all positions that have ever changed. The -t or —no-title option turns off the header showing the interval, command, and current time at the top of the display, as well as the following blank line.
Linux/Unix man page can be found here
Note that you need to escape special characters that are part of the command that you are watching, for example: watch mysql dbname -e \»show processlist\;\»
watch can also be used with multiple commands, quoted and semicolon-separated, like this: watch -n 5 «ls -l; echo; ps -aux» . For discussion see askubuntu.com/q/595927/846840
while true; do sleep 5 ls -l done
watch also has the unfortunate side effect of clearing the screen, so sometimes the loop is useful. Which to use depends on the desired format of the output.
I’ll usually do the loop, but do it on one line. Watch looks much better, though, I’ll have to switch to that.
It’s worth noting you can use —differences to have them highlighted (If you’re concerned about the repainting of the terminal)
This is better than watch . Watch does not work for example when you want to generated random number in each invocation, e.g. watch -n 1 echo $
«watch» does not allow fractions of a second in Busybox, while «sleep» does. If that matters to you, try this:
while true; do ls -l; sleep .5; done
Thanks. This works for busybox consoles that do not have the watch command. I used it to measure the uptime of my system: while true; do uptime; sleep 1; done
FWIW on the old version of busybox (v1.11.2) I’m stuck with, there is no watch, and sleep doesn’t support fractions. But you can use sleep 1 successfully.
sleep already returns 0 . As such, I’m using:
while sleep 3 ; do ls -l ; done
This is a tiny bit shorter than mikhail’s solution. A minor drawback is that it sleeps before running the target command for the first time.
If the command contains some special characters such as pipes and quotes, the command needs to be padded with quotes. For example, to repeat ls -l | grep «txt» , the watch command should be:
I was having trouble getting watch to work properly on a piped expression, but after reading this I could fix it 🙂
Running commands periodically without cron is possible when we go with while .
while true ; do command ; sleep 100 ; done & [ ex: # while true; do echo `date` ; sleep 2 ; done & ]
while true do echo "Hello World" sleep 100 done &
Do not forget the last & as it will put your loop in the background. But you need to find the process id with command «ps -ef | grep your_script» then you need to kill it. So kindly add the ‘&’ when you running the script.
Here is the same loop as a script. Create file «while_check.sh» and put this in it:
#!/bin/bash while true; do echo "Hello World" # Substitute this line for whatever command you want. sleep 100 done
Then run it by typing bash ./while_check.sh &
Isn’t the last & , same as writing the command without & in the end , but calling the script with & : bash ./while_check.sh & ?
@ransh : We can run the script ./while_check.sh & so we can get the process id immediately, when we add the & in script and just run the script without & , we didn’t get any process id but it will run background, as i edited we need ps command to get the process id if we need to stop the script.
If you wish, you can modify the script to echo $! after each background process is launched — that’s the PID of the last child process launched in the background.
echo `date` is just a poor and slightly buggy way to write just date . (The bug has to do with the lack of quoting of the argument to echo .) See also useless use of echo .
watch is good but will clean the screen.
watch -n 1 'ps aux | grep php'
If you want to do something a specific number of times in zsh :
repeat 300 (command1; command2) && sleep 1.5
Note that repeat is not a bash command.
Your answer is a lot downvoted. Reason seem to be: This is not bash!! Please explain under which environment did this work!
If you want to avoid «drifting», meaning you want the command to execute every N seconds regardless of how long the command takes (assuming it takes less than N seconds), here’s some bash that will repeat a command every 5 seconds with one-second accuracy (and will print out a warning if it can’t keep up):
PERIOD=5 while [ 1 ] do let lastup=`date +%s` # do command let diff=`date +%s`-$lastup if [ "$diff" -lt "$PERIOD" ] then sleep $(($PERIOD-$diff)) elif [ "$diff" -gt "$PERIOD" ] then echo "Command took longer than iteration period of $PERIOD seconds!" fi done
It may still drift a little since the sleep is only accurate to one second. You could improve this accuracy by creative use of the date command.
Thanks.. but I have 2 questions, 1- where to save that code? in other word, In which path should I put the file containing that script? that makes it run automatically?! 2- how to include php file in ( # do command ) instead of typing all my code there?
I suggest you research a bit on bash scripts so you can understand the basics of how to run them and so forth.
You can run the following and filter the size only. If your file was called somefilename you can do the following
while :; do ls -lh | awk ‘/some*/’; sleep 5; done
A concise solution, which is particularly useful if you want to run the command repeatedly until it fails, and lets you see all output.
while ls -l; do sleep 5 done
To minimize drift more easily, use:
while :; do sleep 1m & some-command; wait; done
there will still be a tiny amount of drift due to bash’s time to run the loop structure and the sleep command to actually execute.
Will Run ls -l command after every 5s
Output :-
Every 5.0s: ls -l Fri Nov 17 16:28:25 2017 total 169548 -rw-rw-r-- 1 sachin sachin 4292 Oct 18 12:16 About_us_Admission.doc -rw-rw-r-- 1 sachin sachin 865 Oct 13 15:26 About_us_At_glance.doc -rw-rw-r-- 1 sachin sachin 1816 Oct 13 16:11 About_us_Principle.doc -rw-rw-r-- 1 sachin sachin 1775 Oct 13 15:59 About_us_Vission_mission.doc -rw-rw-r-- 1 sachin sachin 1970 Oct 13 16:41 Academic_Middle_school.doc -rw-rw-r-- 1 sachin sachin 772 Oct 16 16:07 academics_High_School.doc -rw-rw-r-- 1 sachin sachin 648 Oct 16 13:34 academics_pre_primary.doc -rw-rw-r-- 1 sachin sachin 708 Oct 16 13:39 academics_primary.doc -rwxrwxr-x 1 sachin sachin 8816 Nov 1 12:10 a.out -rw-rw-r-- 1 sachin sachin 23956 Oct 23 18:14 Ass1.c++ -rw-rw-r-- 1 sachin sachin 342 Oct 23 22:13 Ass2.doc drwxrwxr-x 2 sachin sachin 4096 Oct 19 10:45 Backtracking drwxrwxr-x 3 sachin sachin 4096 Sep 23 20:09 BeautifulSoup drwxrwxr-x 2 sachin sachin 4096 Nov 2 00:18 CL_1 drwxrwxr-x 2 sachin sachin 4096 Oct 23 20:16 Code drwxr-xr-x 2 sachin sachin 4096 Nov 15 12:05 Desktop -rw-rw-r-- 1 sachin sachin 0 Oct 13 23:12 doc drwxr-xr-x 4 sachin sachin 4096 Nov 6 21:18 Documents drwxr-xr-x 27 sachin sachin 12288 Nov 17 13:23 Downloads -rw-r--r-- 1 sachin sachin 8980 Sep 19 23:58 examples.desktop
Использование timeout в Linux с примерами
Вот вы пользователь Linux машины. И вот вам захотелось запустить какую-нибудь команду только на определенное время, и вы задаете вопрос — как это сделать? А вот как — использовать команду timeout .
Как взять timeout — об использовании команды
Базовый синтаксис
Как и следовало ожидать, синтакс у команды экстремально прост: сама команда timeout — опции — длительность выполнения (можно даже с единицами измерения) — целевая команда
Единицы измерения для указания длительности:
Если вы не укажете никакого параметра по длительности, команда не будет активирована.
- timeout 5 ping 1.1.1.1 — пингуем 1.1.1.1 5 секунд
- timeout 5m ping 1.1.1.1 — пингуем 1.1.1 5 минут
- timeout 5.5h ping 1.1.1.1 — 5,5 часов пингуем 1.1.1
Если у вас есть необходимость, можно запустить команду с добавкой sudo (если для целевой команды требуются права суперпользователя):
sudo timeout 100 tcpdump -n -w dump.pcap
Сообщение с космосом или отправка определенного сигнала исполняемому процессу
Если вы не указали какой-то особый сигнал, по умолчанию передается SIGTERM (сигнал о том, что надо бы мягко терминировать процесс). Однако, если вы укажете ключ -s после команды timeout, вы можете указать любой другой допустимый сигнал. К примеру: sudo timeout -s SIGKILL ping 1.1.1.1 или sudo timeout -s 9 ping 1.1.1.1
Обе команды выше идентичны, и если вы хотите увидеть весь список сигналов, просто введите kill -l
Как убить процесс, если он завис
Как вы уже поняли, SIGTERM — это сигнал, который отправляется после истечения таймаута, но он легко может быть проигнорирован процессом, и тогда процесс не остановится. Для уверенности в смерти процесса, нужно использовать ключ -k и некое временное значение. Тогда после окончания таймаута будет отправляться сигнал SIGKILL, который процесс не сможет проигнорировать при всем желании. В примере ниже команда выполняется одну минуту, и, если в течение 10 секунд после окончания таймаута она не «умирает», отправляется сигнал SIGKILL и «добивает» процесс:
sudo timeout -k 10 1m ping 1.1.1.1
Сохраняем статус
Команда timeout всегда возвращает значение 124 после истечения указанного времени или возвращает статус «exit» управляемой команды (той, что вы вводите после команды timeout). Таким образом, вы можете использовать ключ — -preserve-status :
timeout —preserve-status 10 ping 1.1.1.1
Запуск команды явно, а не за кулисами
По умолчанию, timout работает в бэкграунде, и если вы хотите обратного (вдруг после запуска управляемой команды потребуется какой-нибудь пользовательский ввод), нужно использовать ключ -foreground:
timeout —foreground 10m ./bestscripteva.sh
Заключение
В 99% процентов случаев команда timeout требует всего двух аргументов и ни одного факта: времени исполнения и самой исполняемой команды. Однако, вы теперь знаете и другие фишки использования этой замечательной команды.