No seu exemplo, você pode escolher:
pgrep -fc 'sleep 500'
Corresponde aos dois /bin/sleep 500
e sleep 500
.
Ou se você quiser ser mais preciso:
pgrep -fc 'sleep 500$'
O título pode ser um pouco confuso, deixe-me esclarecer ..
Digamos que eu execute os seguintes comandos:
sleep 500
/bin/sleep 500
sleep 30
O que eu estou interessado é, como contar o número de instâncias do programa do sono, com certos argumentos (neste caso, o único argumento é 500
).
Portanto, no exemplo acima, se eu contar o número de instâncias de /bin/sleep 500
, ele deve retornar 2.
Eu tentei isso: pgrep -xfc '/bin/sleep 500'
, mas como ele corresponde exatamente ao argumento entre parênteses, sleep 500
não é contado.
No sistema GNU:
$ ps --no-header -C sleep -o args | grep -Ec ' 500( |$)'
2
Em sistemas que suportam um /proc
semelhante ao Linux:
#!/bin/sh
if [ $# != 2 ]
then
echo usage: "$0" pathname commandline_regexp
exit 1
fi
cd /proc
for p in [0-9]*
do
exe=$(readlink $p/exe 2>/dev/null)
if [ "$exe" = "$1" ] &&
cat $p/cmdline 2>/dev/null | tr '$ sleep 500&
[3] 18280
$ sleep 600&
[4] 18281
$ ./rpgrep /bin/sleep '.*sleep 500 $'
match 18280
$ ./rpgrep /bin/sleep '.*sleep.*00'
match 18280
match 18281
' ' ' | grep -q -- "$2"
then
echo match $p
fi
done
exemplo:
#!/bin/sh
if [ $# != 2 ]
then
echo usage: "$0" pathname commandline_regexp
exit 1
fi
cd /proc
for p in [0-9]*
do
exe=$(readlink $p/exe 2>/dev/null)
if [ "$exe" = "$1" ] &&
cat $p/cmdline 2>/dev/null | tr '$ sleep 500&
[3] 18280
$ sleep 600&
[4] 18281
$ ./rpgrep /bin/sleep '.*sleep 500 $'
match 18280
$ ./rpgrep /bin/sleep '.*sleep.*00'
match 18280
match 18281
' ' ' | grep -q -- "$2"
then
echo match $p
fi
done
Notas:
2>/dev/null
e o processo separado cat
são usados para lidar com a possibilidade de que os processos possam desaparecer enquanto o script está sendo executado. Tags ps