Хотя это не прямой ответ, я бы предложил использовать для этого rsync
:https://medium.com/@sethgoldin/a-gentle-introduction-to-rsync-a-free-powerful-tool-for-media-ingest-86761ca29c34
Проблема в том, что вы передаете вывод 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
, не будет включена в список.
Вы пытаетесь убить awk
.
Простой трюк с регулярными выражениями, позволяющий избежать этого, заключается в использовании своего рода экранирования. Например wor[d]
.
Таким образом, для вашего кода (добавлено переменное цитирование)
for pid in $(ps -ef | awk '/Xvf[b]/ {print $2}'); do kill -9 "$pid"; done