Gestisco un'applicazione che viene eseguita come servizio in background, avviata all'avvio come StartupItem o manualmente dalla riga di comando. Voglio sapere come avviarlo manualmente senza avere un terminale di controllo, o completamente staccare dopo l'avvio.
Usando TextEdit per illustrare, so che se è lanciato da Terminal, blocca il prompt finché il programma non si chiude, e si chiuderà se la finestra del terminale è chiusa.
/Applications/TextEdit.app/Contents/MacOS/TextEdit
Entrambi possono essere evitati aggiungendo nohup
e &
al comando, rispettivamente:
nohup /Applications/TextEdit.app/Contents/MacOS/TextEdit &
Oppure disown
può essere utilizzato al posto di nohup
:
/Applications/TextEdit.app/Contents/MacOS/TextEdit & disown $!
Anche se TextEdit resterà in esecuzione se la finestra del terminale è chiusa, verrà comunque visualizzato un avviso. Questo perché TextEdit ha ancora un terminale di controllo, come indicato da ps -ax
:
$ ps -ax | grep TextEdit
28390 ttys003 0:00.12 /Applications/TextEdit.app/Contents/MacOS/TextEdit
Finché la finestra del terminale non sarà chiusa, TextEdit è finalmente privo di TTY.
$ ps -ax | grep TextEdit
28390 ?? 0:00.12 /Applications/TextEdit.app/Contents/MacOS/TextEdit
So che è possibile avviare il servizio senza un terminale di controllo con chiamate di sistema dirette, perché quando StartupItem viene utilizzato per avviare il servizio (all'avvio o con SystemStarter), viene avviato senza un TTY. La mia domanda è, questo può anche essere realizzato utilizzando solo la riga di comando?