• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

[gelöst] Nice-Value von mit at geplanten Jobs

gameboy

Hacker
Hallo,

wenn ich einen Job mit dem Kommando at für eine bestimmte Zeit plane, dann wird dieser standardmäßig mit Nice-Value 2 ausgeführt.

Beispiel:
Code:
~> echo "netcat -l -p 33333" | at 22:53 08.10.2006
Ab 22:53 Uhr ergibt dann
Code:
~> top -p `pgrep netcat`
folgende Ausgabe:
Code:
  PID USER     PRI  NI  SIZE  RSS SHARE STAT %CPU %MEM   TIME COMMAND
 7850 td        19   2   536  536   452 S N   0.0  0.5   0:00 netcat
Nun zu meiner Frage: Wie kann ich at dazu bewegen, den Job (in obigem Beispiel also den Aufruf von netcat) mit Nice-Value null auszuführen?

Das einzige, was ich dazu der Manpage von at entnehmen konnte, ist die Möglichkeit, den Job über die Option "-q" einer anderen Queue zuzuweisen. Allerdings kann dadurch der nice-Value gegenüber dem Default (2) nur erhöht werden, während ich ihn ja auf null reduzieren möchte... :(

Gibt es da irgendeinen cleveren Trick, um meinen Job mit niedrigerem Nice-Value laufen zu lassen?

Besten Dank im voraus & viele Grüße,
gameboy.
 
OP
G

gameboy

Hacker
Hallo jengelh,

danke für Deine Antwort.

jengelh schrieb:
Sicherstellen, dass der atd nicht mit nice 2 läuft.
Das tut er nicht, er läuft mit Nice-Value null:

Code:
~> top -p `pgrep atd`

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
 4093 at        16   0  1828  520  448 S  0.0  0.1   0:00.00 atd
Viele Grüße,
gameboy.
 
OP
G

gameboy

Hacker
Leider funktioniert auch folgendes nicht:

Code:
~> echo "nice -n 0 netcat -l -p 33333" | at 23:57 08.10.2006
Ebensowenig dieser Versuch, den Nice-Value nachträglich anzupassen:

Code:
~> echo "netcat -l -p 33333 && renice -2 `pgrep netcat`" | at 00:11 09.10.2006
Vielleicht hat ja noch jemand eine andere Idee?

Viele Grüße,
gameboy.
 
Und wo ist die Fehlermeldung? Sonst nach Absetzen eines Jobs in /var/spool/atjobs/ gucken ob das generierte Skript ein 'nice' enthält.
 
OP
G

gameboy

Hacker
Hi again.

jengelh schrieb:
Und wo ist die Fehlermeldung?
Es gibt keine Fehlermeldung: Der Job wird in beiden Fällen korrekt ausgeführt. Der "Fehler" besteht halt darin, daß netcat mit Nice-Value 2 ausgeführt wird.

jengelh schrieb:
Sonst nach Absetzen eines Jobs in /var/spool/atjobs/ gucken ob das generierte Skript ein 'nice' enthält.

Folgendes bringt leider kein Ergebnis (leere Ausgabe):
Code:
su
cd /var/spool/atjobs/
grep nice *

Viele Grüße,
gameboy.
 
Hmm, wenn es nicht Linux wäre hätte ich so etwas in Erinnerung.
Damit können die "queues" mit Priorität, etc. definiert werden.
Finde ich aber auf meinem Linux nicht. Nur auf "alten großen" UNIX.

Code:
File Formats                                         queuedefs(4)

NAME
     queuedefs - queue description file for at, batch, and cron

SYNOPSIS
     /etc/cron.d/queuedefs

DESCRIPTION
     The queuedefs file  describes  the  characteristics  of  the
     queues  managed  by  cron(1M). Each non-comment line in this
     file describes one queue. The format of  the  lines  are  as
     follows:

          q.[njobj][nicen][nwaitw]

     The fields in this line are:

     q     The name of the queue. a is the default queue for jobs
           started  by  at(1);  b  is  the default queue for jobs
           started by batch (see at(1)); c is the  default  queue
           for jobs run from a crontab(1) file.

     njob  The maximum number of jobs that can be run  simultane-
           ously  in that queue; if more than njob jobs are ready
           to run, only the first njob jobs will be run, and  the
           others  will be run as jobs that are currently running
           terminate.  The default value is  100.

     nice  The nice(1) value to give to all jobs  in  that  queue
           that  are  not  run with a user ID of super-user.  The
           default value is 2.

     nwait The number of seconds to wait  before  rescheduling  a
           job that was deferred because more than njob jobs were
           running in that job's queue, or  because  the  system-
           wide  limit  of  jobs executing has been reached.  The
           default value is 60.

     Lines beginning with # are comments, and are ignored.

Viele Grüße,

Haveaniceday
 
OP
G

gameboy

Hacker
Aus "man at":
Code:
-q queue
               uses  the specified queue.  A queue designation consists of a single letter; valid queue desig‐
               nations range from a to z.  and A to Z.  The a queue is the default for at and the b queue  for
               batch.   Queues  with  higher  letters  run  with increased niceness.  The special queue "=" is
               reserved for jobs which are currently running.

Leider ist hier nur von "increased niceness" die Rede, wenn man eine andere als die Default-Queue nutzt. :(

Ehrlich gesagt wundere ich mich ein bißchen, daß ich offenbar der einzige bin, der mit dieser Geschichte ein Problem hat...

Viele Grüße,
gameboy.
 

Asem

Newbie
Das mit nice im at Job funktioniert problemlos im Rahmen dessen, was dem Benutzer zusteht. Der root User kann somit auch die Niceness verkleinern, was einem unprivilegierten User vorenthalten wird. Dabei sind die Werte für nice -n immer als Differenz zum aktuellen nice-Wert zu verstehen, d. h. ein `nice -n 0 ...` ändert überhaupt nichts. Als root kannst du aber schreiben

# echo nice -n -2 blafasel | at <datum>

Die -2 hebt damit die anfängliche Niceness des Prozesses von 2 wieder auf und dein Prozess läuft auf 0. Als normaler User geht das leider nicht.

-- asem
 
Hi Gameboy,

das Ganze scheint fest programmiert zu sein: "queuename" -'a' * 2 => neue prio.

atd.c: ( 3.1.8 )
nice((tolower((int) queue) - 'a' + 1) * 2);


Entweder musst das Paket mit Sourceänderungen selber erstellen oder
einfach in den Start von atd in den Startskripten mit "-2" starten:

/etc/init.d/atd:

--- atd 2006-10-14 18:52:21.000000000 +0200
+++ atd 2006-10-14 18:51:57.000000000 +0200
@@ -61,7 +61,7 @@

# NOTE: startproc return 0, even if service is
# already running to match LSB spec.
- startproc $ATD_BIN
+ startproc -n -2 $ATD_BIN

# Remember status and be verbose
rc_status -v

Damit werden dann die Jobs mit "0" Prio gestartet.

Haveaniceday
 
OP
G

gameboy

Hacker
Hallo haveaniceday,

vielen Dank, Du bist mein Held! - Ich hatte ehrlich gesagt die Hoffnung auf eine Lösung meines Anliegens schon fast aufgegeben, aber mit der von Dir beschriebenen Änderung in /etc/init.d/atd wurde der gewünschte Effekt erzielt.

Nochmals besten Dank & herzliche Grüße,
gameboy.
 
Oben