Pagina 1 di 2

[C] avviare un comando linux ad una certa data e ora

Inviato: martedì 15 maggio 2012, 22:03
da DamianFox
Ciao a tutti!! Prima di tutto volevo salutarvi in quanto mi sono iscritto da poco in questo forum.

Allora il mio problema è il seguente: dovrei implementare un comando in linux, chiamato dcmd, che ha la seguente funzione:
deve eseguire un altro comando linux di default ad una certa data ed ora specificata, entrambi specificati in input

In poche parole nel terminale dovrei scrivere così: dcmd <comando> <data e ora>.

Per la data sono a buon punto, infatti riesco a gestirla in modo corretto; guardando se è nel futuro; se il giorno, mese, anno sono corretti ecc..
Anche il comando credo di aver capito come gestirlo: ho usato la system call execlp e me lo esegue correttamente.

Bene, a questo punto non sono come unire comando e data, cioè eseguire il comando indicato nell'ora indicata.

Qualcuno mi potrebbe spiegare come fare?? :muro:

Grazie! :)

Re: avviare un comando linux ad una certa data e ora

Inviato: martedì 15 maggio 2012, 22:08
da Carlin0
Provato con cronotab ? dovrebbe fare proprio al caso tuo ...

Re: avviare un comando linux ad una certa data e ora

Inviato: martedì 15 maggio 2012, 22:47
da DamianFox
Scusami ma sono ancora alle prime armi con linux, cosa devo fare con crontab?

Re: avviare un comando linux ad una certa data e ora

Inviato: martedì 15 maggio 2012, 23:23
da Laycastle

Re: avviare un comando linux ad una certa data e ora

Inviato: mercoledì 16 maggio 2012, 12:23
da difesaparcosempione
puoi usare anche il comando at

man 1 at
per avere il manuale
ciao

Re: avviare un comando linux ad una certa data e ora

Inviato: mercoledì 16 maggio 2012, 15:29
da DamianFox
grazie a tutti delle risposte!!
Comunque io dovrei implementare un comando che abbia circa le stesse funzioni di "crontab" e "at".

Io pensavo di creare uno script, con scritto "crontab" o "at", poi il comando e la data che passo in input..
Ovviamente lo script vorrei modificarlo attraverso il mio file.c

Potrebbe essere una buona idea??

Re: avviare un comando linux ad una certa data e ora

Inviato: mercoledì 16 maggio 2012, 21:59
da $nake
Forse non hai capito che crontab deve aprire il tuo script.Ti conviene anche a livello di tempo,se fai script in bash,se poi fai script in python o altri linguaggi e vuoi personalizzare puoi anche lasciare perdere cron,ma se vuoi avviare un comando ogni volta ti conviene avviare direttamente con cron,dopo che ci fai l'abitudine vedrai che è semplicissimo...

Re: avviare un comando linux ad una certa data e ora

Inviato: sabato 19 maggio 2012, 11:19
da DamianFox
Forse ho trovato un modo per eseguire il comando ad una certa ora senza usare uno script usando la system call "fork" con l' "exec". Al processo figlio generato faccio eseguire il comando, mentre il processo padre va avanti.. Nel processo figlio vorrei usare la system call "sleep" che mette in pausa il processo per il tempo necessario (cioè aspetto un tot di secondi, poi eseguo il comando con l'exec).

Secondo voi è valido come ragionamento?? Potrebbe causare dei processi zombie??

P.S. Il processo padre deve andare avanti perchè a seguito dell’esecuzione di dcmd deve essere ritornato immediatamente il prompt.

Re: avviare un comando linux ad una certa data e ora

Inviato: sabato 19 maggio 2012, 11:24
da Wilson
Ma stai cercando un programma per fare questo o stai cercando di programmare AT in C cambiandogli nome?

Nel secondo caso hai decisamente sbagliato sezione (e se non è un esercizio scolastico anche obiettivo: perché cercare di fare da zero una delle utilità più antiche e ottimizzate?)

Re: avviare un comando linux ad una certa data e ora

Inviato: sabato 19 maggio 2012, 11:38
da DamianFox
Scusa, inizialmente avevo creato questo post nella sezione programmazione, non so perchè sia finito qui. Comunque quello che sto facendo è un esercizio scolastico ed reimplementare un comando già esistente è richiesto dal testo (tuttavia non deve avere tutte le funzionalità di AT o CRONTAB, ma alcune di esse)..

Re: avviare un comando linux ad una certa data e ora

Inviato: sabato 19 maggio 2012, 12:57
da Wilson
Beh, l'importante è chiarire: il messaggio originario era un po' ambiguo, infatti molti dei consigli rispondevano alla domanda sbagliata (e pure i moderatori si saranno confusi, comunque ho segnalato la discussione perché sia spostata in Programmazione).

Spero che fatta chiarezza tu possa trovare migliori indicazioni, magari per facilitare la cosa modifica il titolo del primo post aggiungendo il linguaggio di programmazione che devi usare.

ps: per il futuro è meglio se descrivi meglio la situazione già da subito: è più facile trovare l'aiuto giusto e lasci anche il forum più leggibile per chi avesse le stesse necessità in futuro :D

Re: [C] avviare un comando linux ad una certa data e ora

Inviato: sabato 19 maggio 2012, 15:47
da DamianFox
Sì è vero! Chiedo perdono! :shy:
Allora riformulo la domanda.

Nel corso di Sistemi Operativi 1 devo fare un progetto e come richiesta c'è da implementare in linguaggio C un comando chiamato dcmd. Questo comando ha la funzione di eseguire un altro comando di default di linux ad una data e ora prestabiliti. Quindi il il comando di default e la data devono essere scritti a terminale.
La data ovviamente deve essere giusta (es: i mesi non devono avere più di 31, bisogna tenere conto anche degli anni bisestili ecc..), ho fatto tutti i controlli del caso e qui non ci sono problemi; anche il comando ho capito come eseguirlo: è sufficiente usare la system call "exec" ed il gioco è fatto. Il problema è che non so come unire i due dati, cioè eseguire il comando di default nella data indicata.

Ho trovato un modo per eseguire il comando dopo un tot di secondi, usando la fork con l'exec, e nel processo figlio creato dalla fork eseguo una "sleep". Ma sono dubbioso su questo metodo: crea dei processi zombie? E' valido usare la sleep oppure ci sono modi più sofisticati?

Spero di essere stato chiaro, altrimenti chiedete.. :D

Re: [C] avviare un comando linux ad una certa data e ora

Inviato: sabato 19 maggio 2012, 16:43
da angleasruf
Funziona bene! Immagine

Re: [C] avviare un comando linux ad una certa data e ora

Inviato: martedì 22 maggio 2012, 21:49
da DamianFox
Ho fatto qualche test al programma e funzione con ls, mkdir, rmdir; non funziona però con "sudo su" o "cd". Quale potrebbe essere il problema?

Re: [C] avviare un comando linux ad una certa data e ora

Inviato: martedì 22 maggio 2012, 23:14
da Wilson
Se non sbaglio cd non è un programma, ma un comando interno della shell (e comunque serve a cambiare la cartella di esecuzione del processo, non dovrebbe poter avere effetti da solo).

Per sudo non so, ma credo dipenda dalla necessità di chiedere la passwd all'utente.

Re: [C] avviare un comando linux ad una certa data e ora

Inviato: martedì 22 maggio 2012, 23:38
da DamianFox
Quindi "ls" o "mkdir" o "rmdir" sono programmi?

Re: [C] avviare un comando linux ad una certa data e ora

Inviato: mercoledì 23 maggio 2012, 0:07
da Wilson
Si, esatto, per verificare puoi usare which

Codice: Seleziona tutto

$ which ls
/bin/ls

Re: [C] avviare un comando linux ad una certa data e ora

Inviato: mercoledì 23 maggio 2012, 1:36
da crap0101
aggiungo, anche type ti può dare info utili

Codice: Seleziona tutto

 
crap0101@crap0101-M:~$ type -a ls cd mkdir type
ls ha "ls --color=auto" come alias
ls è /bin/ls
cd è un comando interno di shell
mkdir è /bin/mkdir
type è un comando interno di shell


Re: [C] avviare un comando linux ad una certa data e ora

Inviato: mercoledì 23 maggio 2012, 15:20
da DamianFox
ok, grazie delle risposte

Per cd penso di aver trovato la soluzione (provo ad usare la funzione chdir), mentre per sudo devo ancora trovarla. Comunque devo chiedere al docente per capire se devo gestire questo caso o meno.

Re: [C] avviare un comando linux ad una certa data e ora

Inviato: venerdì 25 maggio 2012, 17:11
da DamianFox
Nella consegna dell'esercizio è richiesto che il risultato del comando sia scritto in un file. Ho scritto il codice, che dovrebbe essere giusto, però mi crea solo il file ma non mi scrive in esso. Ecco il mio codice:

Codice: Seleziona tutto

if (fork()  == 0) {
			
			if ((fd = open("dcmd_history.txt", O_WRONLY | O_CREAT)) == -1) 
			{
				perror("dcmd_history.txt"); 
				return 0; 
			}

			dup2(fd, 1);
    
			chmod("dcmd_history.txt",S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH);
			
			execv(argv[1],argv);
}
Perchè?

Grazie.