Как остановить цикл bash while в фоновом режиме?

Несмотря на изменение вышеуказанного файла, он все равно показал мне. Программа «java» может быть найдена в следующих пакетах: ошибка.

Вы забыли добавить свою папку Oracle JAVA bin в переменную $ PATH.

PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/usr/Java/jre1.8.0_161/bin"

Задайте вышеуказанный путь в /etc/environment

. Во-вторых, [ ! d4]

Несмотря на изменение вышеуказанного файла, он все равно показал мне. «java» можно найти в следующих пакетах: ошибка.

Не могли бы вы рассказать мне что именно произошло после sudo apt-autoremove.

sudo apt autoremove

Команда

также обнаруживает старые версии ядра Linux, которые больше не нужны, и они не нужны, и они не могут быть переделаны с любым из загрузочных разделов или переконфигурированы по-другому, что может вызвать проблемы. удаляет их также.

Found linux image: /boot/vmlinuz-4.13.0-38-generic
Found initrd image: /boot/initrd.img-4.13.0-38-generic
Found linux image: /boot/vmlinuz-4.13.0-37-generic
Found initrd image: /boot/initrd.img-4.13.0-37-generic

В настоящее время у вас есть две версии изображений ядра после запуска этой команды:

Не похоже, что это испортило ваш раздел. [ ! d10]

19
задан 10 May 2018 в 01:31

12 ответов

Я начал

while true; do yad; sleep 60; done &

и закрыл терминал, чтобы проверить его, теперь у меня такая же проблема.

Если вы уже закрыли терминал, вы запустили цикл в

Давайте посмотрим обзор запущенных процессов с помощью ps fjx, последние строки на моей машине читаем

 2226 11606 11606 19337 ?           -1 S     1000   0:00  \_ /bin/bash
11606 22485 11606 19337 ?           -1 S     1000   0:00  |   \_ sleep 10
 2226  9411  9411  8383 ?           -1 S     1000   0:00  \_ /bin/bash
 9411 17674  9411  8383 ?           -1 Sl    1000   0:00      \_ yad
    1  2215  2215  2215 ?           -1 Ss    1000   0:00 /lib/systemd/systemd --user
 2215  2216  2215  2215 ?           -1 S     1000   0:00  \_ (sd-pam)

Вы можете видеть yad как подпроцесс /bin/bash, если я закрываю yad, он изменяется на sleep 60 на выходе ps. Если древовидное представление слишком запутанно, вы также можете искать выход следующим образом:

ps fjx | grep "[y]ad"  # or respectively
ps fjx | grep "[s]leep 60"

Выходные строки начинаются с двух чисел, первым из которых является идентификатор PPID, идентификатор процесса родительского процесса и второй являющийся PID, идентификатором самого процесса. Именно из-за этого 9411 появляется в обеих строках:

2226  9411  9411  8383 ?           -1 S     1000   0:00  \_ /bin/bash
9411 17674  9411  8383 ?           -1 Sl    1000   0:00      \_ yad

Это bash подоболочка, которую мы хотим убить, и мы только что узнали ее PID, так что теперь все, что остается, является простым

kill 9411  # replace 9411 with the PID you found out!

, и раздражающая подоболочка ушла навсегда.

1

[!d13 ]

Если вы все еще открываете терминал

bash, вы можете указать переменную $!, которая «расширяет идентификатор процесса задания, который недавно был помещен в фоновый режим», поэтому следующее просто убивает последний процесс в фоновом режиме:

kill $!

Если это не последний процесс, просто вы можете получить список запущенных заданий с встроенным jobs, например:

[1]-  Running                 while true; do
    yad; sleep 60;
done &
[2]+  Stopped                 sleep 10

В списке заданий есть два задания, чтобы убить одного из них, вы можете получить к нему доступ с номером задания или ярлыками %, %+ («текущее задание») и %- («предыдущее задание») ), например чтобы убить цикл, выполняемый в фоновом режиме, вы можете сделать

kill %1  # or
kill %-

и убить приостановленное задание sleep 10:

kill %2  # or
kill %+  # or
kill %
33
ответ дан 22 May 2018 в 10:52

Я начал

while true; do yad; sleep 60; done &

и закрыл терминал, чтобы проверить его, теперь у меня такая же проблема.

Если вы уже закрыли терминал, вы запустили цикл в

Давайте посмотрим обзор запущенных процессов с помощью ps fjx, последние строки на моей машине читаем

2226 11606 11606 19337 ? -1 S 1000 0:00 \_ /bin/bash 11606 22485 11606 19337 ? -1 S 1000 0:00 | \_ sleep 10 2226 9411 9411 8383 ? -1 S 1000 0:00 \_ /bin/bash 9411 17674 9411 8383 ? -1 Sl 1000 0:00 \_ yad 1 2215 2215 2215 ? -1 Ss 1000 0:00 /lib/systemd/systemd --user 2215 2216 2215 2215 ? -1 S 1000 0:00 \_ (sd-pam)

Вы можете видеть yad как подпроцесс /bin/bash, если я закрываю yad, он изменяется на sleep 60 на выходе ps. Если древовидное представление слишком запутанно, вы также можете искать выход следующим образом:

ps fjx | grep "[y]ad" # or respectively ps fjx | grep "[s]leep 60"

Выходные строки начинаются с двух чисел, первым из которых является идентификатор PPID, идентификатор процесса родительского процесса и второй являющийся PID, идентификатором самого процесса. Именно из-за этого 9411 появляется в обеих строках:

2226 9411 9411 8383 ? -1 S 1000 0:00 \_ /bin/bash 9411 17674 9411 8383 ? -1 Sl 1000 0:00 \_ yad

Это bash подоболочка, которую мы хотим убить, и мы только что узнали ее PID, так что теперь все, что остается, является простым

kill 9411 # replace 9411 with the PID you found out!

, и раздражающая подоболочка ушла навсегда.

1

Если вы все еще открываете терминал

bash, вы можете указать переменную $!, которая «расширяет идентификатор процесса задания, который недавно был помещен в фоновый режим», поэтому следующее просто убивает последний процесс в фоновом режиме:

kill $!

Если это не последний процесс, просто вы можете получить список запущенных заданий с встроенным jobs, например:

[1]- Running while true; do yad; sleep 60; done & [2]+ Stopped sleep 10

В списке заданий есть два задания, чтобы убить одного из них, вы можете получить к нему доступ с номером задания или ярлыками %, %+ («текущее задание») и %- («предыдущее задание») ), например чтобы убить цикл, выполняемый в фоновом режиме, вы можете сделать

kill %1 # or kill %-

и убить приостановленное задание sleep 10:

kill %2 # or kill %+ # or kill %
33
ответ дан 17 July 2018 в 14:48

Я начал

while true; do yad; sleep 60; done &

и закрыл терминал, чтобы проверить его, теперь у меня такая же проблема.

Если вы уже закрыли терминал, вы запустили цикл в

Давайте посмотрим обзор запущенных процессов с помощью ps fjx, последние строки на моей машине читаем

2226 11606 11606 19337 ? -1 S 1000 0:00 \_ /bin/bash 11606 22485 11606 19337 ? -1 S 1000 0:00 | \_ sleep 10 2226 9411 9411 8383 ? -1 S 1000 0:00 \_ /bin/bash 9411 17674 9411 8383 ? -1 Sl 1000 0:00 \_ yad 1 2215 2215 2215 ? -1 Ss 1000 0:00 /lib/systemd/systemd --user 2215 2216 2215 2215 ? -1 S 1000 0:00 \_ (sd-pam)

Вы можете видеть yad как подпроцесс /bin/bash, если я закрываю yad, он изменяется на sleep 60 на выходе ps. Если древовидное представление слишком запутанно, вы также можете искать выход следующим образом:

ps fjx | grep "[y]ad" # or respectively ps fjx | grep "[s]leep 60"

Выходные строки начинаются с двух чисел, первым из которых является идентификатор PPID, идентификатор процесса родительского процесса и второй являющийся PID, идентификатором самого процесса. Именно из-за этого 9411 появляется в обеих строках:

2226 9411 9411 8383 ? -1 S 1000 0:00 \_ /bin/bash 9411 17674 9411 8383 ? -1 Sl 1000 0:00 \_ yad

Это bash подоболочка, которую мы хотим убить, и мы только что узнали ее PID, так что теперь все, что остается, является простым

kill 9411 # replace 9411 with the PID you found out!

, и раздражающая подоболочка ушла навсегда.

1

Если вы все еще открываете терминал

bash, вы можете указать переменную $!, которая «расширяет идентификатор процесса задания, который недавно был помещен в фоновый режим», поэтому следующее просто убивает последний процесс в фоновом режиме:

kill $!

Если это не последний процесс, просто вы можете получить список запущенных заданий с встроенным jobs, например:

[1]- Running while true; do yad; sleep 60; done & [2]+ Stopped sleep 10

В списке заданий есть два задания, чтобы убить одного из них, вы можете получить к нему доступ с номером задания или ярлыками %, %+ («текущее задание») и %- («предыдущее задание») ), например чтобы убить цикл, выполняемый в фоновом режиме, вы можете сделать

kill %1 # or kill %-

и убить приостановленное задание sleep 10:

kill %2 # or kill %+ # or kill %
33
ответ дан 20 July 2018 в 14:52

Мне нужно отметить, что когда вы закрываете терминал, в который вы ввели эту команду, под-команда должна была умереть вместе с ней. Попытка воспроизвести это показала это поведение.

Теперь, полагая, что вы действительно находитесь в ситуации, когда этого не произошло, один из способов убить программу, которую вы оставили в фоновом режиме, которая была вызвана по команде & в конце команды:

Откройте новую оболочку и запустите echo $$, чтобы отметить ваш текущий идентификатор процесса (ID процесса), чтобы вы не убивали собственный сеанс. Определите PID программы, которая, по вашему мнению, все еще работает; вы можете сделать это, используя команду ps -ef | grep $SHELL, чтобы найти, какие программы запускают оболочку. Обратите внимание на второй столбец слева и обратите внимание на числовое значение, которое отличается от вашего результата echo $$ выше; это ПИД-код, который вы хотите убить. Запустите команду kill -SIGTERM <pid>, где <pid> - это числовое значение, указанное на шаге # 3. Убедитесь, что программа больше не работает, повторив шаг # 2

Вы также можете перезапустить сеанс или компьютер, но вышесказанное позволит вам избежать этого.

5
ответ дан 22 May 2018 в 10:52
  • 1
    Вы также можете использовать top, чтобы убить процесс, нажав k, затем введите PID, а затем дважды нажмите клавишу. – luk3yx 9 May 2018 в 09:19

& заставит терминал создать новый процесс и запустить ваш код внутри него. Таким образом, ваш код становится независимым от терминального процесса. Даже если вы закроете терминал, новый процесс, в котором работает ваш код, не остановится. Поэтому либо удалите &, либо выполните ps -aux, найдите свой процесс и убейте его kill (process id).

-1
ответ дан 22 May 2018 в 10:52

Обычно bg для фона fg для переднего плана. Если вы используете & amp; символ использует fg, он покажет текущую запущенную программу. Нажмите Ctrl + C, чтобы убить.

-3
ответ дан 22 May 2018 в 10:52
  • 1
    Использование bg / fg не будет работать, если терминал отсоединен от bash. Не удалось повторно подключиться с помощью reptyr, потому что bash имеет дочерние процессы (sleep). – xiota 9 May 2018 в 10:04
  • 2
    Он закрыл терминал, потому что он убьет этот процесс. Поэтому в следующий раз он будет использовать fg для закрытия программы. просто – Curious 9 May 2018 в 12:28
  • 3
    @Curious это в следующий раз. Но OP спрашивает о этом времени. – RonJohn 10 May 2018 в 01:35

Обычно bg для фона fg для переднего плана. Если вы используете & amp; символ использует fg, он покажет текущую запущенную программу. Нажмите Ctrl + C, чтобы убить.

-3
ответ дан 17 July 2018 в 14:48

Мне нужно отметить, что когда вы закрываете терминал, в который вы ввели эту команду, под-команда должна была умереть вместе с ней. Попытка воспроизвести это показала это поведение.

Теперь, полагая, что вы действительно находитесь в ситуации, когда этого не произошло, один из способов убить программу, которую вы оставили в фоновом режиме, которая была вызвана по команде & в конце команды:

Откройте новую оболочку и запустите echo $$, чтобы отметить ваш текущий идентификатор процесса (ID процесса), чтобы вы не убивали собственный сеанс. Определите PID программы, которая, по вашему мнению, все еще работает; вы можете сделать это, используя команду ps -ef | grep $SHELL, чтобы найти, какие программы запускают оболочку. Обратите внимание на второй столбец слева и обратите внимание на числовое значение, которое отличается от вашего результата echo $$ выше; это ПИД-код, который вы хотите убить. Запустите команду kill -SIGTERM <pid>, где <pid> - это числовое значение, указанное на шаге # 3. Убедитесь, что программа больше не работает, повторив шаг # 2

Вы также можете перезапустить сеанс или компьютер, но вышесказанное позволит вам избежать этого.

5
ответ дан 17 July 2018 в 14:48

& заставит терминал создать новый процесс и запустить ваш код внутри него. Таким образом, ваш код становится независимым от терминального процесса. Даже если вы закроете терминал, новый процесс, в котором работает ваш код, не остановится. Поэтому либо удалите &, либо выполните ps -aux, найдите свой процесс и убейте его kill (process id).

-1
ответ дан 17 July 2018 в 14:48

Обычно bg для фона fg для переднего плана. Если вы используете & amp; символ использует fg, он покажет текущую запущенную программу. Нажмите Ctrl + C, чтобы убить.

-3
ответ дан 20 July 2018 в 14:52
  • 1
    Используя bg/fg не будет работать как терминал отсоединяется от bash. Не могли бы прикрепить с помощью reptyr, потому что bash имеет дочерние процессы (sleep). – xiota 9 May 2018 в 10:04
  • 2
    Он закрыл терминал, потому что он убьет этот процесс. Поэтому в следующий раз он будет использовать fg для закрытия программы. просто – Curious 9 May 2018 в 12:28
  • 3
    @Curious это в следующий раз. Но OP спрашивает о этом времени. – RonJohn 10 May 2018 в 01:35

Мне нужно отметить, что когда вы закрываете терминал, в который вы ввели эту команду, под-команда должна была умереть вместе с ней. Попытка воспроизвести это показала это поведение.

Теперь, полагая, что вы действительно находитесь в ситуации, когда этого не произошло, один из способов убить программу, которую вы оставили в фоновом режиме, которая была вызвана по команде & в конце команды:

Откройте новую оболочку и запустите echo $$, чтобы отметить ваш текущий идентификатор процесса (ID процесса), чтобы вы не убивали собственный сеанс. Определите PID программы, которая, по вашему мнению, все еще работает; вы можете сделать это, используя команду ps -ef | grep $SHELL, чтобы найти, какие программы запускают оболочку. Обратите внимание на второй столбец слева и обратите внимание на числовое значение, которое отличается от вашего результата echo $$ выше; это ПИД-код, который вы хотите убить. Запустите команду kill -SIGTERM <pid>, где <pid> - это числовое значение, указанное на шаге # 3. Убедитесь, что программа больше не работает, повторив шаг # 2

Вы также можете перезапустить сеанс или компьютер, но вышесказанное позволит вам избежать этого.

5
ответ дан 20 July 2018 в 14:52
  • 1
    Вы также можете использовать top, чтобы убить процесс, нажав k, затем введите PID, а затем дважды нажмите клавишу. – luk3yx 9 May 2018 в 09:19

& заставит терминал создать новый процесс и запустить ваш код внутри него. Таким образом, ваш код становится независимым от терминального процесса. Даже если вы закроете терминал, новый процесс, в котором работает ваш код, не остановится. Поэтому либо удалите &, либо выполните ps -aux, найдите свой процесс и убейте его kill (process id).

-1
ответ дан 20 July 2018 в 14:52

Другие вопросы по тегам:

Похожие вопросы: