[BASH] Wat gaat er mis met een pgrep -f

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • ironheart
  • Registratie: September 2022
  • Laatst online: 09-09 08:34
Hoi,

Ik heb een bash script welke ééns in de zoveel tijd moet runnen maar NIET mag runnen als hij al runt.
Dit check ik middels een pgrep wat ik gevonden heb via: https://askubuntu.com/que...d-make-use-it-to-make-a-c

Met name dit stuk:

code:
1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/bash

# Check if gedit is running
# -x flag only match processes whose name (or command line if -f is
# specified) exactly match the pattern. 

if pgrep -x "gedit" > /dev/null
then
    echo "Running"
else
    echo "Stopped"
fi


Dit heb ik gebruikt in mijn eigen variant:

code:
1
2
3
4
5
6
7
8
9
10
11
#!/bin/bash
if pgrep -x "proton_to_smb" > /dev/null
then
    clear
    echo "Er loopt al een instance."
else
    clear
    echo "Sync - Proton naar SMB gestart."
    rclone sync rfc_proton: rfc_smb_orion:PROTON-RFC --progress
    sleep 10
fi


Toch kan/mag ik meerdere instances runnen wat eigenlijk niet zou mogen. Wat zie ik over het hoofd?

Beste antwoord (via ironheart op 28-03-2024 10:07)


  • Daedalus
  • Registratie: Mei 2002
  • Niet online

Daedalus

Moderator Apple Talk

Keep tryin'

Omdat je uitvoerende process niet "proton_to_smb" is maar "bash", met als argument je scriptnaam (proton_to_smb). Zie bijvoorbeeld dit testscript ($$ is de PID van het huidige bash script):

Bash:
1
2
#!/bin/bash
ps -p $$

user@example /tmp % ./test.sh
  PID TTY           TIME CMD
32913 ttys002    0:00.00 /bin/bash ./test.sh

In plaats van "-x" zou je "-f" kunnen gebruiken om te matchen op argumenten (zoals ook in de comments van je voorbeeld wordt gesuggereerd).

Maar zoals @CH4OS al suggereert is een lockfile wat robuuster en gebruikelijker (bijvoorbeeld met flock).

[ Voor 7% gewijzigd door Daedalus op 27-03-2024 16:50 ]

“You know what I've noticed Hobbes? Things don't bug you if you don't think about them. So from now on, I simply won't think about anything I don't like, and I'll be happy all the time!” | 宇多田ヒカル \o/

Alle reacties


Acties:
  • +3 Henk 'm!

  • CH4OS
  • Registratie: April 2002
  • Niet online

CH4OS

It's a kind of magic

Niet een direct antwoord op de vraag, maar is het niet veel gemakkelijker om gewoon met een 'lockfile' te werken? Wanneer het script start schrijf je het bestand weg als bijvoorbeeld /var/run/script waarin je bijvoorbeeld het PID in zet (mits je de rechten hebt op de map, anders bijvoorbeeld in de eigen map waar het script staat bijvoorbeeld).

Wanneer je het script nog een keer start, controleer je of dat bestand niet bestaat en ga je door, bestaat het wel, stop je de tweede instantie van het script.

Wanneer het script dan daadwerkelijk klaar is, laat je de file verwijderen en kan het dus eventueel weer opgestart worden.

EDIT:
Dit is precies wat de hoogst scorende reactie onder de threat die je linkt eigenlijk ook zegt.

[ Voor 23% gewijzigd door CH4OS op 27-03-2024 16:47 ]


Acties:
  • 0 Henk 'm!

  • ironheart
  • Registratie: September 2022
  • Laatst online: 09-09 08:34
CH4OS schreef op woensdag 27 maart 2024 @ 16:43:
Niet een direct antwoord op de vraag, maar is het niet veel gemakkelijker om gewoon met een 'lockfile' te werken? Wanneer het script start schrijf je het bestand weg als bijvoorbeeld /var/run/script waarin je bijvoorbeeld het PID in zet (mits je de rechten hebt op de map, anders bijvoorbeeld in de eigen map waar het script staat bijvoorbeeld).

Wanneer je het script nog een keer start, controleer je of dat bestand niet bestaat en ga je door, bestaat het wel, stop je de tweede instantie van het script.

Wanneer het script dan daadwerkelijk klaar is, laat je de file verwijderen en kan het dus eventueel weer opgestart worden.
Ik dank je voor je reactie en je hebt inderdaad gelijk dat dat ook een optie is maar dat was niet de essentie van mijn vraag (no offence!)

Acties:
  • Beste antwoord
  • 0 Henk 'm!

  • Daedalus
  • Registratie: Mei 2002
  • Niet online

Daedalus

Moderator Apple Talk

Keep tryin'

Omdat je uitvoerende process niet "proton_to_smb" is maar "bash", met als argument je scriptnaam (proton_to_smb). Zie bijvoorbeeld dit testscript ($$ is de PID van het huidige bash script):

Bash:
1
2
#!/bin/bash
ps -p $$

user@example /tmp % ./test.sh
  PID TTY           TIME CMD
32913 ttys002    0:00.00 /bin/bash ./test.sh

In plaats van "-x" zou je "-f" kunnen gebruiken om te matchen op argumenten (zoals ook in de comments van je voorbeeld wordt gesuggereerd).

Maar zoals @CH4OS al suggereert is een lockfile wat robuuster en gebruikelijker (bijvoorbeeld met flock).

[ Voor 7% gewijzigd door Daedalus op 27-03-2024 16:50 ]

“You know what I've noticed Hobbes? Things don't bug you if you don't think about them. So from now on, I simply won't think about anything I don't like, and I'll be happy all the time!” | 宇多田ヒカル \o/


Acties:
  • +1 Henk 'm!

  • CH4OS
  • Registratie: April 2002
  • Niet online

CH4OS

It's a kind of magic

ironheart schreef op woensdag 27 maart 2024 @ 16:46:
Ik dank je voor je reactie en je hebt inderdaad gelijk dat dat ook een optie is maar dat was niet de essentie van mijn vraag (no offence!)
Maar heb je dan ook goed gekeken naar de op een na hoogst scorende reactie in de thread die je linkt? Die zegt in essentie namelijk exact hetzelfde als wat ik zeg, het legt ook uit waarom dit een robuustere oplossing is. Ik begrijp dus niet helemaal waarom je een vraag van de starter van die thread gebruikt als "antwoord" om jouw probleem ook "op te lossen".
Daedalus schreef op woensdag 27 maart 2024 @ 16:46:
Omdat je uitvoerende process niet "proton_to_smb" is maar "bash", met als argument je scriptnaam (proton_to_smb). Zie bijvoorbeeld dit testscript ($$ is de PID van het huidige bash script):

Bash:
1
2
#!/bin/bash
ps -p $$

user@example /tmp % ./test.sh
  PID TTY           TIME CMD
32913 ttys002    0:00.00 /bin/bash ./test.sh

In plaats van "-x" zou je "-f" kunnen gebruiken om te matchen op argumenten (zoals ook in de comments van je voorbeeld wordt gesuggereerd).
Hieraan toevoegend, op deze manier kun je ook false positives krijgen die je eigenlijk ook liever niet hebt. Met ps filter je dus alleen in de huidige proceslijst, als je dus een (bogus) proces of script hebt draaien die iets anders doet, maar wel hetzelfde heet, zul je dit script dus ook niet kunnen draaien, terwijl het script waarschijnlijk niet in de buurt komt van wat het andere script of proces dan doet. Al stond dit geloof ik ook in de comments van de gelinkte thread, maar vond het wel even belangrijk genoeg het alsnog te melden. CC: @ironheart

[ Voor 59% gewijzigd door CH4OS op 28-03-2024 10:07 ]


Acties:
  • +1 Henk 'm!

  • ironheart
  • Registratie: September 2022
  • Laatst online: 09-09 08:34
Ok ga ik het zo doen. Bedankt.

Acties:
  • +1 Henk 'm!

  • Cyphax
  • Registratie: November 2000
  • Laatst online: 08:07

Cyphax

Moderator LNX
Zou je alleen nog het antwoord dat tot de oplossing heeft geleid willen markeren als beste antwoord? :)

Saved by the buoyancy of citrus

Pagina: 1