Завершите каждый фоновый процесс

Альтернатива, если Вы хотите сохранить полномочия далеко, восстановить их позже, или на другом файле, должна использовать setfacl/getfacl, и это также восстановит (черновой POSIX) ACLs в качестве награды.

getfacl some-file > saved-perms
setfacl -M saved-perms some-other-file

(на Солярисе использовать -f вместо -M).

Однако, хотя они доступны на некотором BSDs, они не находятся на Apple OS/X, где с ACLs управляют chmod только.

10
13.04.2014, 02:46
4 ответа
[112144]Когда они работают

Похоже, что вы можете просто сделать это с помощью [112702]kill[112703] и выводом [112704]jobs -p[112705].

rsync --recursive --progress --partial --rsh=ssh /home/Documents <username>@example.com:/home/Documents
rsync --recursive --progress --partial --rsh=ssh <username>@example.com:/home/Documents /home/Documents

Пример

Теперь у меня работают 3 поддельных задания.

Убейте их все так:

Подтверждаю, что они все исчезли.

Когда они остановлены

Если у вас есть задания, которые остановлены, а не запущены, вы делаете это вместо них.

Пример

OK, чтобы не убить их, но это потому, что сигнал убийства не может быть обработан самим процессом, он останавливается. Так что скажите операционной системе сделать убийство вместо этого. Для этого и нужен [112706]-9[112707].

ls /tmp

Так лучше.

ls /temp 

Когда некоторые процессы запущены, а некоторые остановлены

 ls /temp

Если у вас смешанный пакет процессов, где некоторые процессы остановлены, а некоторые запущены, вы можете сначала сделать [112708]kill[112709], а затем [112710]kill -9[112711].

Немного увеличивая время, если Вам нужно больше, чтобы процессы могли остановиться первыми.

export HISTCONTROL=ignoredups
export HISTCONTROL=ignoreboth

Сигналы

Ни HUP (-1), ни SIGTERM (-15) не могут быть убиты. Но почему? Потому что эти сигналы добрее в том смысле, что они говорят приложению завершить себя. Но поскольку приложение находится в состоянии остановки, оно не может обрабатывать эти сигналы. Таким образом, вы можете использовать только SIGKILL (-9).

Вы можете увидеть все сигналы, которые [112712]kill[112713] предоставляет [112714]kill -l[112715].

Если вы хотите узнать еще больше о различных сигналах, то я настоятельно рекомендую вам взглянуть на страницу signals man,[112716]man 7 signal[112717].[112179].

10
27.01.2020, 20:02
[112190] Хорошо, играя с этим, я вижу, что когда вы убиваете работу, которая остановлена (где выполнение было приостановлено, но не прекращено), то она не закончится, пока не будет выведена на передний план. Обычно программы останавливаются нажатием [112732]Ctrl[112733]-[112734]Z[112735] на терминале. Большинство терминалов в этом случае посылают сигнал [112736]SIGSTOP[112737], но, конечно, есть и другие способы его посылать, например, сигнал [112738]kill -STOP[112739] или [112740]kill -19[112741].
  • Это нормальное поведение для программы, которая не заканчивается сразу, так как программа должна быть запущена для обработки сигнала по умолчанию [112742]SIGTERM[112743], посылаемого сигналом [112744]kill[112745]. Более того, иногда после того, как [112746]bash[112747] посылает [112748]SIGTERM[112749] в фоновый процесс, он каким-то образом заканчивается остановкой (хотя [112750]SIGTERM[112751] все еще находится в ожидании).
  • Самый безопасный способ завершить все задания ([112752] без [112753] использования [112754] kill -9[112755]) - это сначала послать [112756]SIGTERM[112757] с обычным [112758] kill[112759], а затем послать [112760]SIGCONT[112761] на любые оставшиеся задания, например, [112760] SIGCONT[112761] на любые оставшиеся задания:
  • ЗАПИСЬ [112762]SIGCONT[112763] ([112764]18[112765] - номер сигнала) выведет на передний план любые остановленные задания, чтобы они могли обрабатывать [112766]ЗАПИСЬ [112767], как обычно.
  • Если все программы на этом не заканчивают, то можно попробовать еще несколько сигналов, которые обычно делают процесс завершенным, прежде чем прибегнуть к [112768]kill -9[112769]. Первым я рекомендую [112770]SIGHUP[112771], так как многие программы, которые обычно блокируют другие сигналы завершения, реагируют на [112772]SIGHUP[112773]. Обычно это посылается при закрытии управляющего терминала, в частности, это посылается при завершении сеанса [112774]ssh[112775] с [112776]tty[112777]. Многие интерактивные программы, такие как shells, не будут реагировать на другие сигналы завершения, но будут реагировать на это, так как для них было бы проблемой оставаться запущенными после завершения сеанса [112778]ssh[112779] (или после закрытия любого управляющего терминала). Попробовать это можно так

    Снова, конечно, нужно убедиться, что программа не останавливается, чтобы она могла обработать сигнал. Другие сигналы завершения, которые Вы можете попробовать - [112780]SIGINT[112781] ([112782]kill -2[112783]) и [112784]SIGQUIT[112785] ([112786]kill -3[112787]). Но, конечно, преимущества пробовать весь диапазон уменьшаются и могут привести к неизбежному [112788]SIGKILL[112789] (также известному как [112790]kill -9[112791]).[112201].

    1
    27.01.2020, 20:02
    [112136]Это приведет к завершению всех заданий в вашей текущей оболочке по одному:

    make
    make install
    modprobe r8192se_pci
    

    Объяснение: [112690]%[112691] относится к последнему заданию в списке, поэтому он будет зацикливаться до тех пор, пока [112692]kill[112693] не вернет ненулевое значение, что будет означать, что больше нет заданий, которые нужно прекратить.

    enter image description here

    Другим подходом может быть сначала отправка [112694]SIGTERM[112695], затем [112696]SIGCONT[112697], чтобы Ваши задания могли продолжаться, и первое, что они сделают, это получат Ваш [112698]SIGTERM[112699].

    /bin
    /sbin
    /usr
    /lib
    /opt (if you have it)
    /etc
    

    (по какой-то причине встроенное [112700]kill[112701] странно, поэтому я использовал здесь внешнее).[112143].

    0
    27.01.2020, 20:02

    Вы можете попробовать это.

    for x in `jobs -p`; do kill -9 $x; done
    

    Однако, если вы хотите завершить процесс, вы можете выдать команду как,

    for x in `jobs -p`; do kill -15 $x; done
    

    Со страницы Wiki команды Kill,

    Процесс может быть послан сигнал SIGTERM четырьмя способами (идентификатор процесса в данном случае '1234'):

    kill 1234
    kill -s TERM 1234
    kill -TERM 1234
    kill -15 1234
    

    Процесс может посылать сигнал SIGKILL тремя способами:

    kill -s KILL 1234
    kill -KILL 1234
    kill -9 1234
    

    Как объяснялось в ответе на этот вопрос , это разница между командой termination и командой kill.

    Сигнал завершения, SIGTERM, является сигналом, который может быть перехвачен в программе. Часто процессы, предназначенные для запуска в фоновом режиме, улавливают этот сигнал и запускают процесс выключения, что приводит к чистому выходу. Сигнал самоуничтожения SIGKILL не может быть перехвачен. Когда он посылается в процесс, это приводит к внезапному завершению работы программы.

    При выключении или перезагрузке компьютера, например, обычно выполняющимся процессам сначала посылается сигнал SIGTERM, который позволяет им выйти чисто, если они поддерживают его. Затем, через несколько секунд SIGKILL посылается процессам, которые все еще работают, чтобы принудительно освободить используемые ресурсы (например, используемые файлы) и продолжить последовательность выключения (например, размонтировать файловые системы).

    2
    27.01.2020, 20:02

    Теги

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