LINUX.ORG.RU

ограничение времени работы программ


0

0

Можно ли как-то ограничить время работы определенных программ? Например, tcpdump дать 10 мин, trafshow 5 мин, после чего они прекращают работу по определенному сигналу. Операторы повадились запускать парочку tcpdump, после чего уходят на обед/перекур, а сервер немного устает от такого объема работы. Полностью запретить выполнение нельзя, им положено работать по долгу службы, речь идет и временном лимитировании...

anonymous

killall раз в 10 минут в кроне

TuxR ★★★★
()

killall -STOP appname
killall -CONT appname

Igron ★★★★★
()

может, что-то типа такого в кроне / в цикле?

kill `ps -A |grep tcpdump |awk '{print $1;}'; sleep 30;`

тех, кто через 30 секунд после проверки ещё продолжает работать - убить.

alexsaa
()
Ответ на: комментарий от alexsaa

sdio дал наиболее изящное решение - лично я раньше не знал про такую команду.

sdio: вероятно, это что-то не LSBшное

$ timeout
bash: timeout: команда не найдена
$ sudo yum install timeout
livna                       | 2.1 kB     00:00
fedora                      | 2.1 kB     00:00
updates-newkey              | 2.3 kB     00:00
updates                     | 2.6 kB     00:00
local                       |  951 B     00:00
Setting up Install Process
Parsing package install arguments
No package timeout available

$ yum search timeout
apcupsd.i386 : APC UPS Power Control Daemon for Linux
coldet.i386 : 3D Collision Detection Library
ecore.i386 : Event/X abstraction layer
libevent.i386 : Абстрактная библиотека оповещений об асинхронных событиях
pam_pkcs11.i386 : модуль входа PKCS #11/NSS PAM
perl-Event-Lib.i386 : Perl wrapper around libevent
sudo.i386 : Позволяет предоставить определенным пользователям права суперпользователя

$ lsb_release -d
Description:    Fedora release 8 (Werewolf)

Что за зверь такой неизвестный? :)

Slavaz ★★★★★
()
Ответ на: комментарий от Slavaz

$ dpkg -S /usr/bin/timeout
timeout: /usr/bin/timeout

$ apt-get source timeout
Need to get 329kB of source archives.
Get:2 http://ftp.debian.org lenny/main tct 1.11-6.5 (tar) [314kB]
dpkg-source: extracting tct in tct-1.11

$ cd tct-1.11
$ more README.First

The Coroner's Toolkit (TCT) - a Brief Introduction

TCT is a collection of tools - some large, some small, some in perl,
some in C - that are all either oriented towards gathering or 
analyzing forensic data on a Unix system.

The most current version of TCT may be found at both:

        http://www.fish.com/forensics/
        http://www.porcupine.org/forensics/

sdio ★★★★★
()
Ответ на: комментарий от sdio

Спасибо информацию. Насколько я понял, timeout - это часть тулкита, предназначенного для определения размера звиздеца после взлома. Конкретно timeout - полезняжка. ИМХО ей место в coreutils.

Slavaz ★★★★★
()

Нашел у себя старенький скрипт, который убивает определенные ресурсоемкие процессы
(которые использовали более 2000 секунд процессорного времени):

#!/bin/bash
ps axho pid,time,comm,user | sort -rk 2 | tr -d \: | \
grep -e 'progname1\|progname2' | \
awk '{if ($2 > 2000 && $4 != "root" ) \
{print "Kill " $4 " [ " $2 " ] " $1; system ("kill " $1)}}'

Просьба скрипт особо не пинать, т.к. писался "побыстрому" 3-4 года назад :)
Работает до сих пор, вызывается периодически из крона.

chief
()
Ответ на: комментарий от sdio

Для истории и возможности поиска на ЛОРе:

cat timeout.c

/*++
/* NAME
/*      timeout 1
/* SUMMARY
/*      run command with bounded time
/* SYNOPSIS
/*      \fBtimeout\fR [-\fIsignal\fR] \fItime\fR \fIcommand\fR ...
/* DESCRIPTION
/*      \fBtimeout\fR executes a command and imposes an elapsed time limit.
/*      The command is run in a separate POSIX process group so that the
/*      right thing happens with commands that spawn child processes.
/*
/*      Arguments:
/* .IP \fI-signal\fR
/*      Specify an optional signal to send to the controlled process.
/*      By default, \fBtimeout\fR sends SIGKILL, which cannot be caught
/*      or ignored.
/* .IP \fItime\fR
/*      The elapsed time limit after which the command is terminated.
/* .IP \fIcommand\fR
/*      The command to be executed.
/* DIAGNOSTICS
/*      The command exit status is the exit status of the command
/*      (status 1 in case of a usage error).
/* AUTHOR(S)
/*      Wietse Venema
/*      This program is part of SATAN.
/*--*/

/* System libraries. */

#include <sys/types.h>
#include <signal.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>

extern int optind;

/* Application-specific. */

#define perrorexit(s) { perror(s); exit(1); }

static int kill_signal = SIGKILL;
static char *progname;
static char *commandname;

static void usage()
{
    fprintf(stderr, "usage: %s [-signal] time command...\n", progname);
    exit(1);
}

static void terminate(sig)
int     sig;
{
    signal(kill_signal, SIG_DFL);
    fprintf(stderr, "Timeout: aborting command ``%s'' with signal %d\n",
            commandname, kill_signal);
    kill(0, kill_signal);
}

int     main(argc, argv)
int     argc;
char  **argv;
{
    int     time_to_run;
    pid_t   pid;
    pid_t   child_pid;
    int     status;

    progname = argv[0];

    /*
     * Parse JCL.
     */
    while (--argc && *++argv && **argv == '-')
        if ((kill_signal = atoi(*argv + 1)) <= 0)
            usage();

    if (argc < 2 || (time_to_run = atoi(argv[0])) <= 0)
        usage();

    commandname = argv[1];

    /*
     * Run the command and its watchdog in a separate process group so that
     * both can be killed off with one signal.
     */
    setsid();
    switch (child_pid = fork()) {
    case -1:                                    /* error */
        perrorexit("timeout: fork");
    case 00:                                    /* run controlled command */
        execvp(argv[1], argv + 1);
        perrorexit(argv[1]);
    default:                                    /* become watchdog */
        (void) signal(SIGHUP, terminate);
        (void) signal(SIGINT, terminate);
        (void) signal(SIGQUIT, terminate);
        (void) signal(SIGTERM, terminate);
        (void) signal(SIGALRM, terminate);
        alarm(time_to_run);
        while ((pid = wait(&status)) != -1 && pid != child_pid)
             /* void */ ;
        return (pid == child_pid ? status : -1);
    }
}

----------------------------------------------------------------
$ gcc -O2 -o timeout timeout.c
$ strip timeout
$ ls -l timeout
-rwxr-xr-x 1 user group 5936 2008-10-08 22:13 timeout

$ ./timeout 
usage: ./timeout [-signal] time command...

sdio ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.