Re: ændre mode for en kørende kommando, eksempel rsync

From: Kasper Bonne (none@kbonne--gmail.com.lh.bsd-dk.dk)
Date: Fri 14 May 2010 - 04:18:35 CEST


Date: Thu, 13 May 2010 22:18:35 -0400
Subject: Re: ændre mode for en kørende kommando, eksempel rsync
From: Kasper Bonne <none@kbonne--gmail.com.lh.bsd-dk.dk>
To: bsd-dk@bsd-dk.dk

2010/5/13 Michael Kell Jensen <none@mkj--micrun.net.lh.bsd-dk.dk>:
> Jeg har i det sidste stykke tid gået og tænkt over en feature jeg godt kunne
> bruge til mange unix kommandoer.
>
> Foreksemepl vil jeg gerne kunne køre rsync med forskellige verbose niveauer
> -v -vv -vvv?
> Og når jeg så er tilfreds skifte med det jeg observer,
> skifte til mode -q -> quiet, no output at all.
> _uden_ at stoppe programmet.
>
> Er der nogen måde at gøre det på? eller er der nogen unix værktøjer i kender
> til som understøtter sådan noget.
>
> wrap det i en form for script?, hvor jeg kan sende switches, jeg kan ikke
> lige se nogen åbenlys måde at gøre det på?

Som regel bliver 'command switches' jo fortolket når et program
starter, og på baggrund af dem bliver forskellige variable sat til en
passende værdi. Det vil være meget program-specifikt om du vil kunne
ændre den måde et kørende program opfører sig på. Den eneste måde jeg
kan se at det skulle kunne lade sig gøre (uden at ændre koden), er at
skrive direkte til det kørende programs memory. Hvis du kan få ændret
en variabel som bliver læst igen og igen og som påvirker programmets
opførsel er det muligt at du kan slippe af sted med det.

Hvis jeg var dig ville jeg dog prøve en anden løsning. Jeg ville
skrive en signal-handeler rutine som, når du sender et passende signal
(f.eks. SIGINFO eller SIGUSR1/SIGUSR2), ændrer det du gerne vil have
ændret. Det kræver dog at du er villig til at modificere kildekoden
til programmet og at du kan finde et passende signal som ikke er i
brug. Du kan sende et SIGINFO til et kørende program ved at trykke
Ctrl+T, ellers kan signaler sendes til kørende programmer med kill(1).

Det er ret simpelt at tilføje en signal-handeler rutine til et
program. Håber nedenstående kan give dig inspiration:

#include <signal.h>
...
void change_option (int sig)
{
        verbose = 0;
}
...
int main (int argc, char *argv[])
{
        signal(SIGINFO, change_option);
        ...
}

mvh
/Kasper



This archive was generated by hypermail 2b30 : Mon 31 May 2010 - 23:00:02 CEST