Уничтожить запущенные экземпляры процессов, за исключением тех, которые запускаются из-за выполнения текущей команды

Хотя это не прямой ответ, я бы предложил использовать для этого rsync:https://medium.com/@sethgoldin/a-gentle-introduction-to-rsync-a-free-powerful-tool-for-media-ingest-86761ca29c34

0
09.04.2020, 14:42
2 ответа

Проблема в том, что вы передаете вывод psв вызов awk, который ищет строку «Xvfb» и, следовательно, также содержит строку «Xvfb» в своей собственной командной строке -. Поскольку оба процесса канала выполняются одновременно, сам вызов awkтакже будет зарегистрирован в выводеps(попробуйте, что произойдет, если вы просто наберете ps -ef | awk '/Xvfb/'в строке команды -).

Однако к моменту запуска цикла (, что происходит, когда команда -подстановка $( … )и, следовательно, процесс awkтакже завершается ), этот awkпроцесс не больше не существует, поэтому killнатыкается на это.

Вы должны быть в безопасности, если измените команду в подстановке команд на

ps -ef | awk '$0 ~ /Xvfb/ && index($0,"awk")==0 {print $2}'

, который гарантирует, что ни одна команда, содержащая подстроку awk, не будет включена в список.

0
28.04.2021, 23:18

Вы пытаетесь убить awk.

Простой трюк с регулярными выражениями, позволяющий избежать этого, заключается в использовании своего рода экранирования. Например wor[d].

Таким образом, для вашего кода (добавлено переменное цитирование)

for pid in $(ps -ef | awk '/Xvf[b]/ {print $2}'); do kill -9 "$pid"; done
0
28.04.2021, 23:18

Теги

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