Does anyone know how can I ensure that no matter when I run this script it only brings the right processes running on a reliable way?
Você poderia pedir a ps
para listar os processos pertencentes ao usuário atual -u $USER
e para imprimir seus pids, pids pai e cadeias de comando completas (comando e argumentos) e, em seguida, passá-los para awk para fazer mais verificação. O awk recebe o pid do script atual ( -v me=$1
) e o nome do processo a ser procurado ( -v procname=$2
) e, em seguida, é instruído a procurar linhas que correspondam a três requisitos:
- onde o pid (coluna 1) é não o pid do script atual e
- onde o ppid (coluna 2) é não o pid do script atual e
- em que a cadeia do comando corresponde ao argumento fornecido
Se alguma linha corresponder a todos esses dois requisitos, o awk imprimirá o pid; esses pids (se houver) são canalizados por meio de wc -l
para contar suas instâncias. Você poderia simplesmente aumentar um contador, mas se quisesse investigar os pids para outros propósitos, isso deixaria uma maneira de recuperá-los.
getProcessNum() {
ps -u "$USER" -o pid=,ppid=,args= |
awk -v me="$1" -v procname="$2" \
'$1 != me && $2 != me && index(substr($0,19,length(procname)), procname) { print $1 }' |
wc -l
}
A principal diferença em relação a meuh é que pedi a ps
para imprimir o pai pids, para que possamos especificamente ignorar quaisquer filhos do script atual; Outra diferença é que eu pesquisei especificamente a string começando na coluna 19 (ignorando o pid e o ppid) e ainda mais limitada ao comprimento do nome do processo, antes de determinar uma correspondência com index
. Fiz isso para evitar tantos falsos positivos quanto possível, como o reconhecidamente inventado vi ksh93 myAvoidedScript.k
.
Você teria que passar o encantamento exato do script, conforme fornecido por ps -o args
, para excluir corretamente essas instâncias - por exemplo, aqui, getProcessNum $$ "/bin/ksh93 myAvoidedScript.k"
. Se o script puder ser chamado com parâmetros ( /bin/ksh93 myAvoidedScrip.k foo
) ou opções ( ksh93 -x myAvoidedScript.k
) ou caminhos completos ( /bin/ksh93 /path/to/myAvoidedScript.k
) ou com caminhos de intérprete diferentes ( ./ksh93 myAvoidedScript.k
) ou diretamente ( ./myAvoidedScript.k
), então a verificação falharia.
A menos que você possa garantir a invocação precisa do script, será difícil garantir que apenas uma cópia desse script seja executada por vez.