Убийство цикла 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 4

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>