2009-07-05 11 views
6

Ho sviluppato un'applicazione Qt che contiene un server TCP e così via. Ora sto cercando di creare pacchetti Ubuntu e lasciare che l'applicazione si avvii automaticamente all'avvio.Esegui l'applicazione Qt all'avvio come demone Linux

l'applicazione deve essere in esecuzione, anche se nessuno è connesso, il che significa un demone avviato tramite uno script in /etc/init.d/

Ho provato semplicemente eseguire l'applicazione in fase di start e invio di un kill- segnale su stop nello script init.d ma ciò significa che l'applicazione viene eseguita in primo piano e blocca lo script init.

Forking like in an other question sembra quasi funzionare, ottengo "errore sconosciuto" dopo aver tentato di avviare un server TCP. Tuttavia, dovrebbe esserci un modo semplice per scrivere uno script di init che esegua la mia applicazione in background all'avvio sulle varie distribuzioni Linux.

Qualcuno potrebbe indicarmi la giusta direzione?

Utilizzando Ubuntu 9.10 con Qt 4.5

+0

Presentate qualche GUI o è completamente console? –

+0

È consolico e non ha mai bisogno di input da parte dell'utente. – dutchmega

risposta

1

è la vostra programma di un'applicazione GUI o funziona senza interfaccia grafica?

Perché non lo si limita nello script di init usando &?

1

È necessario aggiungere un collegamento simbolico a una qualsiasi delle directory rc? .d in/etc in base al runlevel predefinito. Oppure usa lo script update-rc.d: prima devi creare uno script in /etc/init.d che esegua l'applicazione; in secondo luogo, utilizzare lo script update-rc.d per aggiungere i file necessari per l'avvio.

È possibile trovare informazioni su come farlo leggendo update-rc.d pagina di manuale:

$man update-rc.d 
+0

update-rc.d è specifico per la distribuzione. –

2

Il modo migliore è probabilmente quello di usare QtService in cui l'opera di biforcazione è curato per voi.

Tuttavia, se si desidera continuare a creare il proprio, è necessario eseguire lo sfondo dell'applicazione o eseguirlo tramite start-stop-daemon fornito con OpenRC o un'utilità simile per la distribuzione.

Inoltre, assicurarsi di collegarsi solo alla libreria condivisa QtCore. Anche se l'applicazione potrebbe essere a riga di comando e non aprire mai la GUI, ciò non significa che X non sia necessario per l'esecuzione dell'applicazione. Ad esempio, una serie di test di unità:

$ ldd runTests | grep Qt 
libQtTest.so.4 => /usr/lib/qt4/libQtTest.so.4 (0x00007fd424de9000) 
libQtXml.so.4 => /usr/lib/qt4/libQtXml.so.4 (0x00007fd424baa000) 
libQtGui.so.4 => /usr/lib/qt4/libQtGui.so.4 (0x00007fd4240db000) 
libQtCore.so.4 => /usr/lib/qt4/libQtCore.so.4 (0x00007fd422644000) 

Poiché QtGui è presente, tutte le librerie X è anche presente in, anche se filtrato dall'uscita sopra.

0

Penso che il modo più semplice sia di non avere alcuna logica daemonize nella propria applicazione, invece di utilizzare un programma di supporto per avviare l'app in background e gestire un pid per esso.

Ad esempio, startproc.

0

Puoi dare un'occhiata ai molti script già presenti nel tuo /etc/init.d per l'ispirazione. Da quello che vedo lì, la maggior parte dei daemon standard di Linux dipendono da startproc per l'avvio e killproc per l'arresto.

+0

Fornire esempi più specifici qui sarebbe utile. Inoltre, si prega di utilizzare la formattazione del codice per rendere i tuoi post più leggibili. – bcr