Убийство цикла while, который работает в фоновом режиме без PID
Я новичок во всем, что является частью Linux, поэтому, пожалуйста, не торопитесь.
Я создал "скрипт", который работает в фоновом режиме:
while true; do echo "I'm alive" >> alive.log ; done &
Выходные данные скрипта сохраняются в файле alive.журнал, который присутствует в домашнем каталоге пользователя. Проблема в том, что у меня нет ideea, как убить цикл, так как он заполняет мое дисковое пространство, если я хочу удалить файл, то цикл создаст новый файл и заполнит его текстом "Я жив", как я просил его сделать.
I пробовал использовать:
ps - aux | grep while
Или
ps - aux | grep alive
Выходные данные для двух строк дадут мне PID, который мне нужен, Но проблема в том, что сценарий является циклом, который означает, что PID будет меняться каждый раз, когда он работает сам (рекурсивно), поэтому я не могу использовать PID, чтобы убить процесс.
Я также попробовал использовать:
pkill while
killall while
Результат для обеих строк равен 0 (вывод можно увидеть при использовании pkill while-c "0" или killall while: "while: процесс не найден";
Какие-нибудь предложения, пожалуйста?
5 ответов:
Я написал предложение в файле сценария, который назывался while.sh, и прогнал его по оболочке:
[edemon@CentOS workspace]$ ./while.sh [edemon@CentOS workspace]$
Там нет PID. Я использовал инструмент top command для поиска моего while.sh, он сказал мне:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 4036 edemon 20 0 5268 756 436 R 97.3 0.0 0:07.93 bash 2469 root 20 0 94412 29m 10m S 7.8 2.0 1:49.19 Xorg 2788 edemon 20 0 74300 12m 10m S 1.9 0.9 1:38.79 nm-applet 4040 edemon 20 0 2708 1072 796 R 1.9 0.1 0:00.01 top
Процесс отца в то время-Баш, поэтому я убил 4036. Размером с живого человека.бревно больше не росло.
Если вы запустили этот скрипт, он будет отображаться как
bash
, Если вы командуетеps -ef
:UID PID PPID C STIME TTY TIME CMD james 27262 2448 98 17:35 pts/3 00:00:12 bash james 2448 2446 0 Jul19 pts/3 00:04:49 bash
(Если вы используете
bash
), а его Родительский pid также указывает на процессbash
(PID 27262-это ваша маленькая петля выше). Итак, найдите все процессыbash
, которые имеют процессbash
в качестве родителя. Это может сработать:$ awk '/^james/ && $NF=="bash" && NR==FNR{a[$2];next} /^james/ && $NF=="bash" && $3 in a{print $2}' <(ps -ef) <(ps -ef) 27262 27359
Итак, те являются хорошими кандидатами для убийства. В этом случае другой - это
ps -ef
, а другой-это знак.
Это ответ @James Brown в комментариях.
Введите
fg
, чтобы получить его на переднем плане и убить его сctrl-c
самый быстрый способ решить эту проблему.
Попробовал перезагрузиться два раза, первый раз не сработал, но после второго цикла больше не было, и файл не переписывался.
Кроме того, после того, как я избавился от него, я снова вошел в сценарий:
while true; do echo "I'm alive" >> alive.log ; done &
Как утверждает @ssharma при входе в скрипт выводится PID, даже если цикл продолжает изменять PID, я смог убить цикл с этим PID.
Спасибо за помощь!
Я решил опробовать ваш "сценарий" на заднем плане. Когда я бегу
while true; do echo "I'm alive" >> alive.log ; done &
Он возвращает идентификатор процесса в стандартный вывод, тем самым показывая, что процесс выполняется в фоновом режиме. Вы можете убить этот идентификатор процесса с помощью:
kill <pid>