Я только что начал использовать следующий сценарий Python Dotfiles, который является удобным инструментом, который автосвязывает файлы для Вас: https://pypi.python.org/pypi/dotfiles
Попробуйте pgrep -f running_script
- параметр -f использует для сопоставления всю командную строку, а не только имя процесса
ps - ef | grep -v grep | grep <script_name> | awk '{print $2}'
Приведенная выше команда даст PID для имени_скрипта. Также вы можете заставить скрипт записать временный файл с его PID.
Добавьте строку внутри скрипта: echo $$>/tmp/script_pid.tmp
ps -o pid, args -C bash | awk '/ running_script / {print $ 1}'
Он использует ps
для получения pid и args для всех процессов bash, а затем использует awk для печати pid (поле 1) соответствующего процесса.
Кстати, ps -o pid, args -C bash
дает вам pid и имя запрашиваемого файла сценария - имя сценария находится в аргументах bash
команда.
Если вы собираетесь использовать ps
вместо pgrep
, по крайней мере, используйте все его возможности, а не чрезвычайно уродливую ps ... | grep -v grep | grep | awk
конструкция. Последний grep
даже не нужен, поскольку awk
может выполнять сопоставление с образцом. На самом деле, ни один из greps не нужен, так как awk все это может: ps ax | awk '! / awk / && / myprocessname / {print $ 1} '
#!/bin/bash
# pidofargs.sh
# get process id by first argument of a process
# using `ps -eo pid,args` and `read -a`
# sample use: pidofargs.sh python /usr/bin/youtube-dl
search_grep="$1" # first filter
search_arg1="$2" # second filter
# first filter
ps -eo pid,args | grep "$search_grep" | while read pid args
do
read -a arg < <(echo "$args")
# pid = process id
# arg[0] = executable file of process
# arg[1] = first argument of process
# second filter
if [[ "${arg[1]}" == "$search_arg1" ]]
then
# success
echo $pid
break
fi
done