Иногда появляется необходимость запустить тот или иной D-скрипт в заданное время и сохранить данные в логе. А как же быть со интерактивными скриптами типа
mmapfiles.d, которые ждут нажатия Ctrl-C ? Легко!
Обычный запуск выглядит так:
Теперь заставим скрипт собирать данные в течение 10 секунд и после этого закончить работу:
Если кто-то на этой-же системе уже использовал этот таймер, скрипт может закончить работу раньше. Эту проблему можно обойти так:
Теперь можно спокойно поставить D-скрипт в кронтаб и перенаправить вывод в лог-файл. Это относится только к D-скриптам, c расширением
d. В DTrace-скриптах, написанных на Perl или ksh, необходимо использовать соответствующие этим языкам счетчики, или использовать небольшую утилиту
ktime, написанную одним мексиканцем. Ktime запускает скрипт, ждет заданное время и затем посылает сигнал ctr+c ( SIGINT).
Исходник
ktime.c:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
/*
Author: Jorge Alberto Garcia Gonzalez
email: jorge.garcia.gonzalez(en)gmail.com
Usage: ./ktime shortlived.d 10
ktime
way to compile: gcc ktime.c -o ktime
*/
int main( int argc, char *argv[]){
pid_t child_pid=0;
char *arguments=NULL;
int narguments= argc-2; /* chid arguments*/
int element=1;
int lenarg=0;
for( element=1; element <=argc-2 ;element++){
lenarg+= strlen(argv[ element ]) +1 ;
printf("%d \n",lenarg);
}
lenarg+=1;
element=1;
arguments=(char *) malloc( lenarg * sizeof(char) );
for( element=1; element <=argc-2 ; element++ ){
strcat( arguments, argv[ element ] );
strcat( arguments, " ");
}
if( ( child_pid=fork() )==0 ){
execv(argv[1],&arguments );
}else
{
sleep( atoi(argv[argc-1]) ) ;
kill(child_pid,SIGINT) ;
}
return 0;
}
Запуск:
Синтаксис: