Domanda

Ho sviluppato un'applicazione Qt che contiene un server TCP e simili.Ora sto provando a creare pacchetti Ubuntu e lasciare che l'applicazione si avvii automaticamente all'avvio.

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

Ho provato semplicemente a eseguire l'applicazione all'avvio e a inviare un segnale di interruzione all'arresto nello script init.d, ma ciò significa che l'applicazione viene eseguita in primo piano e blocca lo script init.

Biforcazione come in un'altra domanda sembra quasi funzionare, ricevo un messaggio di errore sconosciuto dopo aver provato ad avviare un server TCP.Tuttavia, dovrebbe esserci un modo semplice per scrivere uno script di inizializzazione che esegua la mia applicazione in background all'avvio sulle varie distribuzioni Linux.

Qualcuno potrebbe indicarmi la giusta direzione?

Utilizzo di Ubuntu 9.10 con Qt 4.5

È stato utile?

Soluzione

Il tuo programma è un'applicazione GUI o funziona senza GUI?

Perché non lo esegui semplicemente in background all'interno dello script init usando &?

Altri suggerimenti

Il modo migliore è probabilmente usare QtService dove il lavoro di biforcazione è curato per te.

Tuttavia, se desideri continuare a crearne una tua, dovresti eseguire l'applicazione in background o eseguirla tramite start-stop-demone che viene fornito con OpenRC o un'utilità simile per la tua distribuzione.

Inoltre, assicurati di collegarti solo alla libreria condivisa QtCore.Sebbene l'applicazione possa 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 unit test:

$ 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, vengono inserite anche tutte le librerie X, sebbene filtrate dall'output precedente.

È necessario aggiungere un collegamento simbolico in una qualsiasi delle directory rc?.d in /etc a seconda del runlevel predefinito.Oppure usa lo script update-rc.d:per prima cosa è necessario 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 iniziare.

Puoi trovare informazioni su come farlo leggendo la pagina man di update-rc.d:

$man update-rc.d

Penso che il modo più semplice sia non avere alcuna logica di demonizzazione nella tua applicazione stessa, utilizzare invece un programma di supporto per avviare l'app in background e gestirne un pid.

Per esempio, startproc.

Puoi dare un'occhiata ai numerosi script già presenti nel tuo file /etc/init.d per ispirazione.Da quello che vedo lì, la maggior parte dei demoni Linux standard dipendono da startproc per iniziare, e killproc per fermarsi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top