Oct 172012
 

In un prececente articolo Ho parlato dei comandi cron e crontab che sono il modo standard per pianificare le cose ricorrenti su un sistema Gnu/Linux.

Ma a volte è necessario fare una cosa ad una specifica data ed ora per una volta sola e per queste attività l’opzione migliore è di usare at, un altro modo di utilizzare at è per eseguire un comando più tardi quando il computer non sarà troppo carico.

O un altro motivo potrebbe essere che si desidera eseguire un comando che richiede un sacco di tempo per finire e dovete disconnettervi dal server, at potrebbe essere utilizzato in questa situazione, ma per queste attività vi suggerisco di dare un’occhiata agli articoli su come eseguire comandi in background e l’ utilità screen




Quindi l’idea del comando at è di facilitare “la programmazione di una azione per una volta”. In questo senso è complementare a cron che solitamente viene utilizzato per pianificare processi periodici, vediamo ora i suoi più comuni utilizzi

Il comando at fa parte di una serie di quattro comandi che includono i comandi at, batch, atq, e atrm:

  • at esegue i comandi in un momento specificato.
  • atq elenca i lavori in attesa dell’utente, a meno che l’utente non sia il superutente; in tal caso, tutti i lavori sono elencati.
  • atrm elimina uno dei lavori in attesa, identificati dal loro numero.
  • batch esegue comandi quando permesso dal livello di carico del sistema, in altre parole, quando il carico medio scende sotto 1.5, o il valore specificato nella chiamata di atd.

uso base del comando at

at richiede il comando da eseguire. Dopo aver inserito il comando, premere ctrl-D per terminare, queste sono le principali opzioni che è possibile utilizzare con il comando at:

 at [-m] [-q coda] [-f file] TIME

E questo è quello che significano:

  • -q coda utilizza la coda specificata. Una indicazione per una di coda è costituita da una singola lettera; le denominazioni di coda valide vanno da a z e dalla A alla Z. La coda a è quella predefinita per at e b come coda per batch. Code con lettere superiori saranno eseguite con maggiore niceness, ovvero minore priorità. La coda speciale “=” è riservata per i lavori che sono attualmente in esecuzione. Se un lavoro viene inviato a una coda indicata con una lettera maiuscola, è considerato come se fosse stato mandato al comando batch in quel momento. Se il comando atq è dato con una coda specifica, mostrerà solo i lavori in attesa in quella coda.
  • -m Invia una mail all’utente quando il lavoro è completato, anche se non non c’era alcun output.
  • -f file Legge il lavoro dal file indicato anziché dallo standard input.
  • TIME At permette specifiche di tempo abbastanza complesse, che estendono POSIX.2. Accetta tempistiche nel formato hh:mm per eseguire un lavoro in un momento specifico del giorno. Si può anche dire in che giorno verrà eseguito il lavoro, dando una data nella forma nome del mese il giorno con l’anno facoltativo, o dando una data nella forma MMGGAA o GG/MM/AA o GG.MM.YY. La specifica di una data deve seguire le specifiche del momento nella giornata.

Esempi:

Mentre facevo i test questa era l’esatta data

#date
Wed Oct 17 22:31:05 CEST 2012

Così dando solo l’orario sarà pianificato per la prossima volta che quell’orario sarà raggiunto, in questo esempio, chiedo di pianificare un processo per le 20.00 e così sarà elaborato il giorno seguente in quell’orario:

#at -f my_at_test.sh 20:00
warning: commands will be executed using /bin/sh
job 4 at Thu Oct 18 20:00:00 2012

Mentre dando un’orario che deve essere ancora raggiunto nella giornata, il lavoro viene pianificato per la setssa giornata a quell’orario.

#at -f my_at_test.sh 22:35
warning: commands will be executed using /bin/sh
job 5 at Wed Oct 17 22:35:00 2012

E questo è un altro esempio che utilizza ctrl-D per terminare:

at midnight Friday
warning: commands will be executed using /bin/sh
at> cp -a /project/source/* /backup/source/^C
at> 
job 6 at Fri Oct 19 00:00:00 2012

Mostrare tutti i processi pianificati utilizzando atq

È possibile utilizzare il comando atq o come alternativa a -l, per visualizzare tutti i lavori pianificati o attualmente in esecuzione, l’unica opzione disponibile con questo comando è -q per specificare una particolare coda.

#atq
3	Thu Oct 18 10:25:00 2012 a linuxaria
4	Thu Oct 18 20:00:00 2012 a linuxaria
6	Fri Oct 19 00:00:00 2012 a linuxaria

Questo output non è così utile secondo me, in quanto non si vede che cosa fa il task numero 3 o gli altri. Per vedere il contenuto di un lavoro pianificato, è possibile utilizzare

 a -c jobnumber

questo vi darà un lungo output che mostrerà l’ambiente completo di comando e il comando stesso:

#at -c 6
 
#!/bin/sh
# atrun uid=1000 gid=1000
# mail linuxaria 0
umask 22
SSH_AGENT_PID=1579; export SSH_AGENT_PID
XDG_SESSION_COOKIE=586bed7d66c5f3bf0810f6ce0000001c-1350495018.439467-8023144; export XDG_SESSION_COOKIE
WINDOWID=25165830; export WINDOWID
GNOME_KEYRING_CONTROL=/tmp/keyring-m0UVoj; export GNOME_KEYRING_CONTROL
USER=linuxaria; export USER
LIBGL_DRIVERS_PATH=/usr/lib/fglrx/dri:/usr/lib32/fglrx/dri; export LIBGL_DRIVERS_PATH
SSH_AUTH_SOCK=/tmp/ssh-DbbUjzXR1501/agent.1501; export SSH_AUTH_SOCK
USERNAME=riccio; export USERNAME
SESSION_MANAGER=local/mint-desktop:@/tmp/.ICE-unix/1501,unix/mint-desktop:/tmp/.ICE-unix/1501; export SESSION_MANAGER
DEFAULTS_PATH=/usr/share/gconf/default.default.path; export DEFAULTS_PATH
XDG_CONFIG_DIRS=/etc/xdg/xdg-default:/etc/xdg; export XDG_CONFIG_DIRS
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games; export PATH
DESKTOP_SESSION=default; export DESKTOP_SESSION
PWD=/tmp; export PWD
GNOME_KEYRING_PID=1424; export GNOME_KEYRING_PID
LANG=en_US.UTF-8; export LANG
MANDATORY_PATH=/usr/share/gconf/default.mandatory.path; export MANDATORY_PATH
MDM_XSERVER_LOCATION=local; export MDM_XSERVER_LOCATION
SHLVL=1; export SHLVL
HOME=/home/linuxaria; export HOME
LOGNAME=linuxaria; export LOGNAME
XDG_DATA_DIRS=/usr/share/default:/usr/local/share/:/usr/share/:/usr/share/mdm/; export XDG_DATA_DIRS
DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-QWgLeCbkps,guid=b1c32f270937311ee26524ff00000031; export DBUS_SESSION_BUS_ADDRESS
MDMSESSION=default; export MDMSESSION
WINDOWPATH=8; export WINDOWPATH
MDM_LANG=en_US.UTF-8; export MDM_LANG
XAUTHORITY=/home/linuxaria/.Xauthority; export XAUTHORITY
COLORTERM=gnome-terminal; export COLORTERM
cd /tmp || {
	 echo 'Execution directory inaccessible' >&2
	 exit 1
}
cp -a /project/source/* /backup/source/^C

Questo è molto meglio capire esattamente che cosa farà un comando.

Rimuovere un processo pianificato utilizzando atrm

Ora abbiamo visto l’elenco dei comandi pianificati con at e facoltativamente il contenuto, ora è il momento di vedere come eliminarli, per questo possiamo usare il comando atrm jobnumber o at -d jobnumber, per eliminare un particolare lavoro. Così per rimuovere l’operazione pianificata numero 3 dovete solo digitare

 atrm 3

. Questo non darà alcun output sulla riga di comando, ma se eseguite nuovamente atq, vedrete che è stata eliminata l’operazione pianificata selezionata.

Limitare l’utilizzo di at per alcuni utenti

I file /etc/at.allow e /etc/at.deny determinano quali utenti possono inviare comandi per una esecuzione successiva via at o batch.

Il formato dei file è un semplice elenco di nomi utente, uno su ogni linea. Gli spazi vuoti non sono consentiti.

Root può usare sempre at. Se esiste il file /etc/at.allow, solo i nomi menzionati in esso sono autorizzati a utilizzarlo, normalmente non esiste.

Se non esiste /etc/at.allow, /etc/at.deny è utilizzato, questo file di solito contiene una lunga lista di “utenti di sistema” come bin, backup, ftp o www-data.

Popular Posts:

Flattr this!

  One Response to “Gestire le attività pianificate su Linux con il comando at”

  1. I use at frequently: 1)with only 1.5 mbit of download bandwidth, downloading a linux ISO can take quite a while for me. So I do it when my local network has the least traffic, and I do it while I sleep. 2)recording radio shows using streamripper.

 Leave a Reply

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

(required)

(required)

*