Ошибка:
имя каталога: отсутствует операнд.
Попробуйте dirname --help 'для получения дополнительной информации
, потому что dirname
не имеет операнда (ничего не было передано в качестве аргумента). Это произошло потому, что grep
вернул пустые результаты.
Если вы используете GNU xargs
, вы можете использовать -r
( - no-run-if-empty
), чтобы не запускать команду , когда ввод пустой (не содержит непустых).
Чтобы заставить его работать с BSD xargs
, вам, вероятно, придется переписать команду, чтобы проверить, пуст ли ввод, и выполнить команду соответствующим образом. Или просто проигнорируйте ошибку, подавив stderr, например:
find. ... -exec sh -c "grep ... | xargs dirname 2> / dev / null || true" ';'
Или вы можете использовать цикл while, чтобы избежать синтаксического анализа пустых файлов или возникновения проблем с пробелы в именах файлов, например
find . -type f -name ".htaccess" -print0 | while IFS= read -r -d '' file; do
grep -Eli '^deny from all$' "$file" | while IFS= read -r -d '' deny_file; do
dirname "$deny_file"
done
done
Вы должны быть в состоянии просто убить скрипт по имени с помощью команды pkill
.
$ pkill -9 dispatcher.sh
выдержка из man page
pgrep, pkill - look up or signal processes based on name and other
attributes
OPTIONS
-signal
--signal signal
Defines the signal to send to each matched process. Either
the numeric or the symbolic signal name can be used. (pkill
only.)
Дополнительную информацию смотрите в man page для pkill
для дополнительной информации.
Если вы обнаружили, что больше не знаете идентификатор процесса (PID), вы можете найти его несколькими способами.
Вы можете использовать pgrep
, чтобы найти процесс по имени.
$ pgrep dispatcher.sh
12345
Затем вы можете выполнить kill -8 12345
.
Большинство людей научились находить PID с помощью ps
. Вы можете искать свой процесс в выводе следующим образом.
$ ps -eaf | grep [d]ispatcher.sh
saml 2735 1 0 Jan11 ? 00:02:50 dispatcher.sh
PID - это второй столбец в выводе (обычно). Приведенный выше трюк, когда я обернул первую букву искомого процесса, исключает появление в результатах grep
. Попробуйте сделать это без квадратных скобок, чтобы понять, что я имею в виду.
. Если вы видите процессы Java, порожденные диспетчером, в выводе ps, попробуйте проверить PPID этих процессов. Проверьте, является ли это процессом bash, и если да, попробуйте его убить.
Учитывая ваш полный сценарий, кажется, что вы пытаетесь просто получить заданный количество параллельно выполняемых заданий. При использовании GNU Parallel это выглядит так:
# -q to avoid lib/* expanding
seq 0 $toBeDoneNum |
parallel -j $maxProcessNum -q java -classpath ".:./conf:./lib/*" odx.comm.cwv.main.Checking