Nieuws:

We zijn er weer.

Na lange tijd van afwezigheid zijn we er weer  :laugh:
We hebben alle wachtwoorden gereset, je oude wachtwoord werkt niet meer.Je moet via het "wachtwoord vergeten"-linkje je wachtwoord resetten. Je krijgt hiervoor een mailtje op het adres dat je bij ons geregistreerd hebt.

De komende tijd zijn we nog druk bezig om de rest van de site op te bouwen, dus het kan zijn dat sommige onderdelen (tijdelijk) niet werken.

Welkom, Gast. Alsjeblieft inloggen of registreren.
Heb je de activerings-mail niet ontvangen?

Auteur Topic: Vraag over BASH  (gelezen 1872 keer)

Offline BailHope

  • Lid
    • Techneut
  • Steunpunt: Nee
Vraag over BASH
« Gepost op: 2008/06/10, 20:53:51 »
Ik probeer een klein scriptje in Bash te schrijven dat niets anders doet dan een ander script draaien en dan de prioriteit (de nice-waarde) van dat script te verhogen naar 0.

Het andere script laten starten werkt prima, maar ik zit vast bij het verhogen van de nice waarde.

Via ps krijg ik een proceslijst, daaruit filter ik met grep de juiste lijn (en in die lijn bevind zich de procesID die ik nodig heb om een het commando renice te gebruiken).
Maar het probleem is dat dit programma met threads werkt, en dat er 4 threads worden opgestart. Er moet er maar één een hogere prioriteit krijgen toegekend en deze threads dragen allemaal precies dezelfde naam.
Het grep-commando geeft dus 4 lijnen terug en het is steeds de derde opgestarte thread (die ook derdes staat in het resultaat van grep) dat ik moet verhogen.
Maar hoe krijg ik die derde lijn vanboven?

Via het cut-commando kan ik de procesID er uit knippen maar dat werkt niet over meerdere lijnen blijkbaar. Ik kan die methode dus niet uitleggen dat hij naar de derde lijn moet kijken.

Er bestaat ook een sort functie maar die kan ik niet laten sorteren op het veld dat ik wil. Sorteren op ProcesID zorgt er namelijk voor dat de lijn steeds derdes staat en het is de processor-tijd waarop ik wil sorteren. Die staat derdes in de output op een lijn en de thread die ik van prioriteit wil verhogen heeft steeds de hoogste processortijd.

Heeft iemand nog een idee om me mee verder te helpen?

EDIT: Overigens nog een klein probleem. Het script dat opgestart wordt is folding@home, maar dit geeft output naar het scherm, en dit verschijnt in de terminal. Het script zelf heeft geen optie om output uit te schakelen, kan ik dan in bash zeggen dat hij dit niet mag tonen?
Ubuntu user #12046
Mijn blog voor techneuten: http://techneut.wordpress.com
Voor de professionele IT'er: http://it-potato.blogspot.com

marialice

  • Gast
Vraag over BASH
« Reactie #1 Gepost op: 2008/06/10, 23:40:33 »
Vast niet de mooiste oplossing, maar werkt wel: combinatie van head en tail.
head -3 | tail -1geeft de derde regel van boven.

Offline profoX

  • Lid
    • wesley
    • Lionslink
  • Steunpunt: Nee
Vraag over BASH
« Reactie #2 Gepost op: 2008/06/11, 00:13:57 »
Volgens mij is dit simpeler :)

renice -10 `pgrep NAAM -n`

Verklaring: renice het laatst gestartte (nieuwste) proces waar naam "NAAM" in voorkomt naar -10

Indien pgrep NAAM -n toch niet geeft wat je wil, dan even duidelijk maken wat je precies probeert, want het is een beetje gokken zo.
Human Knowledge Belongs To The World -- Antitrust (2001)
Nederlandstalige Ubuntu documentatie van Ubuntu-NL (wiki)

marialice

  • Gast
Vraag over BASH
« Reactie #3 Gepost op: 2008/06/11, 10:25:16 »
Dat gaat niet werken denk ik.

Citaat
het is steeds de derde opgestarte thread [van de vier] [..] dat ik moet verhogen.

Offline BailHope

  • Lid
    • Techneut
  • Steunpunt: Nee
Vraag over BASH
« Reactie #4 Gepost op: 2008/06/11, 16:07:11 »
Ok, het is gelukt!
Even tonen wat ik heb gedaan:

ps -u $USER --sort=-stime | grep Fah | head -1 | cut -c2-6ps haalt een lijst op van alle processen voor de huidige gebruikers (-u $USER zorgt daarvoor)
--sort=-stime sorteert de lijst op system-time, hoe lang de bepaalde thread dus al draait. Het minteken voor de stime negeert de hele sortering, zodat deze dus achterstevoren sorteert. Zo komt het hoogste bovenaan te staan.
grep Fah haalt uit de hele lijst enkel de vier threads die ik zocht
head -1 haalt daar enkel de bovenste lijn uit (de lijn van de thread die ik wil verhogen
cut -c2-6 haalt uit die lijn de ProcesID (die zich op de tekens 2 tot 6 bevindt)

En het resultaat is een prachtige ProcesID die ik dan kan gebruiken in mijn renice commando

Overigens, Profox, bedankt voor de opmerking. Ik wist eerst en vooral niet dat pgrep bestond. Maar pgrep -n selecteert enkel de nieuwst opgestarte thread. Dat zou de vierde thread zijn terwijl ik de derde wou verhogen. Maar ik heb er in elk geval iets van bijgeleerd.

Bedankt voor alle suggesties mensen!
Ubuntu user #12046
Mijn blog voor techneuten: http://techneut.wordpress.com
Voor de professionele IT'er: http://it-potato.blogspot.com

Offline Kev

  • Lid
  • Steunpunt: Nee
Vraag over BASH
« Reactie #5 Gepost op: 2008/06/14, 15:24:13 »
Renice naar een waarde boven hetgeen je hebt dacht ik kan enkel de root user doen.
All Hail Lelouch, The 99th Emperor of Britannia
All Hail Lelouch! All Hail Lelouch!
Iedereen heeft het recht op mijn waarheid, zo wees geprezen.

Offline BailHope

  • Lid
    • Techneut
  • Steunpunt: Nee
Vraag over BASH
« Reactie #6 Gepost op: 2008/06/14, 15:35:19 »
Dat is waar.

Gewoon 'sudo' in je bash-bestand opnemen, net voor het renice commando. Dan wordt het beheerderspaswoord gevraagd voor dat commando.

Je kan natuurlijk ook het script met sudo laten draaien (en eventueel afdwingen door eerst te controleren of er wel als root gedraaid wordt) maar dat is niet zo een goede oplossing.

Eerst en vooral krijg je een vertekend beeld, door het ganse script als root te laten draaien van de ps -u $USER output, want die geeft de processenlijst voor root, niet voor de gebruiker.
Ubuntu user #12046
Mijn blog voor techneuten: http://techneut.wordpress.com
Voor de professionele IT'er: http://it-potato.blogspot.com