Как завершить фоновый процесс в Linux, если pid неизвестен?

Ошибка:

имя каталога: отсутствует операнд. Попробуйте 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
1
20.03.2018, 20:33
3 ответа

Вы должны быть в состоянии просто убить скрипт по имени с помощью команды 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, чтобы найти процесс по имени.

$ pgrep dispatcher.sh
12345

Затем вы можете выполнить kill -8 12345.

ps

Большинство людей научились находить PID с помощью ps. Вы можете искать свой процесс в выводе следующим образом.

$ ps -eaf | grep [d]ispatcher.sh
saml      2735     1  0 Jan11 ?        00:02:50 dispatcher.sh

PID - это второй столбец в выводе (обычно). Приведенный выше трюк, когда я обернул первую букву искомого процесса, исключает появление в результатах grep. Попробуйте сделать это без квадратных скобок, чтобы понять, что я имею в виду.

4
29.04.2021, 00:43

. Если вы видите процессы Java, порожденные диспетчером, в выводе ps, попробуйте проверить PPID этих процессов. Проверьте, является ли это процессом bash, и если да, попробуйте его убить.

0
29.04.2021, 00:43

Учитывая ваш полный сценарий, кажется, что вы пытаетесь просто получить заданный количество параллельно выполняемых заданий. При использовании GNU Parallel это выглядит так:

# -q to avoid lib/* expanding
seq 0 $toBeDoneNum |
  parallel -j $maxProcessNum -q java -classpath ".:./conf:./lib/*" odx.comm.cwv.main.Checking
0
29.04.2021, 00:43

Теги

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