Команда kill
- это очень простая оболочка для системного вызова kill
, который знает только об идентификаторах процесса (PID). pkill
и killall
также являются оболочками для системного вызова kill
(фактически, библиотеки libc, которая непосредственно вызывает системный вызов), но может определить PID для вас на основе таких вещей, как имя процесса, владелец процесса, идентификатор сеанса и т. д.
Как работают pkill
и killall
, можно увидеть с помощью ] ltrace
или strace
на них. В Linux они оба читают файловую систему / proc
и для каждого найденного pid (каталога) проходят путь таким образом, чтобы идентифицировать процесс по его имени или другим атрибутам. Технически, как это делается, зависит от ядра и системы. Обычно они читают из / proc /
, который содержит имя команды во втором поле. Для pkill -f
и pgrep
проверьте запись / cmdline
для каждой записи процесса PID.
pkill
и pgrep
используют системный вызов readproc
, тогда как killall
нет. Я не могу сказать, есть ли разница в производительности: вам придется протестировать это самостоятельно.
Большое спасибо @glenn jackman, вы подняли мой скилл. Итак, команда, которая сработала для меня, это:
for dir in /mnt/data/service/fmriprep/geht/sub-P*; do if [ -d "$dir" ]; then
num=${dir##*P} && python 2_correlation.py -i "$dir" -o
"/mnt/data/service/corr_graph/correlation_P${num}.csv";fi done
Для каждой итерации цикла необходимо извлекать цифры после «P» и использовать их в имени CSV-файла:
in_dir=/mnt/data/service/fmriprep/geht
out_dir=/mnt/data/service/corr_graph
for dir in "$in_dir"/sub-P*; do
num=${dir##*P}
python 2_correlation.py -i "$dir" -o "$out_dir/correlation_P${num}.csv"
done