Bagaimana cara menggunakan perintah nohup tanpa mendapatkan nohup.out?
309
Saya punya masalah dengan perintah nohup.
Ketika saya menjalankan pekerjaan saya, saya memiliki banyak data. Output nohup.out menjadi terlalu besar dan proses saya melambat. Bagaimana saya bisa menjalankan perintah ini tanpa mendapatkan nohup.out?
The nohupperintah saja menulis ke nohup.outjika output dinyatakan akan pergi ke terminal. Jika Anda telah mengarahkan ulang output dari perintah di tempat lain - termasuk /dev/null- di situlah ia pergi.
Jika Anda menggunakan nohup, itu mungkin berarti Anda ingin menjalankan perintah di latar belakang dengan meletakkan yang lain &di akhir semuanya:
nohup command >/dev/null 2>&1 & # runs in background, still doesn't create nohup.out
Di Linux, menjalankan pekerjaan dengan nohupsecara otomatis menutup inputnya juga. Pada sistem lain, terutama BSD dan macOS, itu tidak terjadi, jadi ketika berjalan di latar belakang, Anda mungkin ingin menutup input secara manual. Sementara menutup input tidak berpengaruh pada pembuatan atau tidak nohup.out, itu menghindari masalah lain: jika proses latar belakang mencoba membaca apa pun dari input standar, itu akan berhenti, menunggu Anda untuk membawanya kembali ke latar depan dan mengetik sesuatu. Jadi versi ekstra amannya seperti ini:
Namun, perhatikan bahwa ini tidak menghalangi perintah untuk mengakses terminal secara langsung, juga tidak menghapusnya dari grup proses shell Anda. Jika Anda ingin melakukan yang terakhir, dan Anda menjalankan bash, ksh, atau zsh, Anda dapat melakukannya dengan menjalankan disowntanpa argumen sebagai perintah berikutnya. Itu berarti proses latar belakang tidak lagi terkait dengan "pekerjaan" shell dan tidak akan ada sinyal yang diteruskan dari shell. (Perhatikan perbedaannya: disownproses ed tidak mendapat sinyal yang diteruskan secara otomatis oleh shell induknya - tetapi tanpa nohup, itu akan tetap menerima HUPsinyal yang dikirim melalui cara lain, seperti killperintah manual . nohupProses ed mengabaikan semua dan semua HUPsinyal, tidak peduli bagaimana mereka dikirim.)
Penjelasan:
Dalam sistem Unixy, setiap sumber input atau target output memiliki nomor yang terkait dengannya yang disebut "file descriptor", atau "fd" singkatnya. Setiap program yang berjalan ("proses") memiliki set-nya sendiri, dan ketika sebuah proses baru dimulai, ia memiliki tiga di antaranya sudah terbuka: "input standar", yaitu fd 0, terbuka untuk proses membaca, sementara "output standar" (fd 1) dan "standard error" (fd 2) terbuka untuk ditulisi. Jika Anda hanya menjalankan perintah di jendela terminal, maka secara default, apa pun yang Anda ketik masuk ke input standarnya, sementara output standar dan kesalahan standar dikirim ke jendela itu.
Tetapi Anda dapat meminta shell untuk mengubah di mana salah satu atau semua deskriptor file menunjuk sebelum meluncurkan perintah; itulah yang pengalihan ( <, <<, >, >>) dan pipa ( |) operator melakukan.
Pipa adalah yang paling sederhana dari ini ... command1 | command2mengatur output standar command1untuk dimasukkan langsung ke input standar command2. Ini adalah pengaturan yang sangat praktis yang telah mengarah ke pola desain tertentu di alat UNIX (dan menjelaskan adanya kesalahan standar, yang memungkinkan program untuk mengirim pesan kepada pengguna meskipun hasilnya akan masuk ke program berikutnya dalam pipa) . Tetapi Anda hanya dapat menyalurkan output standar ke input standar; Anda tidak dapat mengirim deskriptor file lain ke pipa tanpa juggling.
Operator pengalihan lebih ramah karena mereka memungkinkan Anda menentukan deskriptor file mana yang akan diarahkan. Jadi 0<infilemembaca input standar dari file bernama infile, sementara 2>>logfilemenambahkan kesalahan standar ke akhir file bernama logfile. Jika Anda tidak menentukan angka, maka input redirection default ke fd 0 ( <sama dengan 0<), sedangkan output redirection default ke fd 1 ( >sama dengan 1>).
Anda juga dapat menggabungkan deskriptor file bersama-sama: 2>&1berarti "kirim kesalahan standar ke mana pun output standar berjalan". Itu berarti bahwa Anda mendapatkan aliran tunggal output yang mencakup standard out dan standard error yang dicampur dengan tidak ada cara untuk memisahkan mereka lagi, tetapi itu juga berarti bahwa Anda dapat memasukkan standard error dalam pipa.
Jadi urutannya >/dev/null 2>&1berarti "kirim output standar ke /dev/null" (yang merupakan perangkat khusus yang hanya membuang apa pun yang Anda tulis ke sana) "dan kemudian mengirim kesalahan standar ke mana pun output standar" (yang baru saja kami pastikan /dev/null). Pada dasarnya, "buang apa pun yang ditulis perintah ini ke salah satu deskriptor file".
Ketika nohupmendeteksi bahwa tidak ada kesalahan standar atau output terpasang ke terminal, itu tidak repot untuk membuat nohup.out, tetapi mengasumsikan bahwa output sudah diarahkan ke mana pengguna ingin pergi.
The /dev/nullperangkat bekerja untuk input, juga; jika Anda menjalankan perintah dengan </dev/null, maka setiap upaya dengan perintah itu untuk membaca dari input standar akan langsung menemui akhir file. Perhatikan bahwa sintaks gabungan tidak akan memiliki efek yang sama di sini; ini hanya berfungsi untuk mengarahkan deskriptor file ke file lain yang terbuka dengan arah yang sama (input atau output). Shell akan membiarkan Anda melakukannya >/dev/null <&1, tetapi yang akhirnya membuat proses dengan deskriptor file input terbuka pada aliran output, jadi alih-alih hanya memukul akhir file, setiap upaya membaca akan memicu kesalahan fatal "deskriptor file tidak sah".
@ Tim - jawaban benar untuk Linux, tetapi tidak untuk BSD atau OS X, yang nohuptidak tidak masukan dekat standar secara otomatis. Perhatikan bahwa nohupini bukan shell builtin tetapi utilitas biner.
Mark Reed
nohup adalah bagian dari coreutils. Apakah maksud Anda implementasi nohupberbeda untuk linux dan untuk BSD atau OS X?
Tim
Iya. Nama "coreutils" mengacu pada paket GNU. Tetapi BSD, OS X, SmartOS / Illumos, dan banyak Unix komersial - pada dasarnya, yang telah ada lebih lama dari GNU - memiliki utilitas inti non-GNU. awkberbeda, sedberbeda, nohupberbeda ...
Bukankah seharusnya >/ dev / null bukan </ dev / null?
Scott Chu
3
@ScottChu < /dev/nullmengalihkan input standar untuk nohup. Linux tidak memerlukan ini tetapi POSIX memungkinkan perilaku di mana nohuptidak dapat berjalan di latar belakang jika input standar terhubung ke terminal. Contoh dari sistem tersebut adalah BSD dan OS X.
Mikko Rantalainen
8
Anda mungkin ingin menggunakan program detach . Anda menggunakannya seperti nohuptetapi tidak menghasilkan log keluaran kecuali Anda menyuruhnya. Ini halaman manualnya:
NAME
detach - run a command after detaching from the terminal
SYNOPSIS
detach [options] [--] command [args]
Forks a new process, detaches is from the terminal, and executes com‐
mand with the specified arguments.
OPTIONS
detach recognizes a couple of options, which are discussed below. The
special option -- is used to signal that the rest of the arguments are
the command and args to be passed to it.
-e file
Connect file to the standard error of the command.
-f Run in the foreground (do not fork).
-i file
Connect file to the standard input of the command.
-o file
Connect file to the standard output of the command.
-p file
Write the pid of the detached process to file.
EXAMPLE
detach xterm
Start an xterm that will not be closed when the current shell exits.
AUTHOR
detach was written by Robbert Haarman. See http://inglorion.net/ for
contact information.
Catatan Saya tidak memiliki afiliasi dengan pembuat program. Saya hanya pengguna yang puas dari program ini.
Mengarahkan kembali output sudo menyebabkan sudo meminta kembali kata sandi, oleh karena itu diperlukan mekanisme yang canggung untuk melakukan varian ini.
Jawaban:
The
nohup
perintah saja menulis kenohup.out
jika output dinyatakan akan pergi ke terminal. Jika Anda telah mengarahkan ulang output dari perintah di tempat lain - termasuk/dev/null
- di situlah ia pergi.Jika Anda menggunakan
nohup
, itu mungkin berarti Anda ingin menjalankan perintah di latar belakang dengan meletakkan yang lain&
di akhir semuanya:Di Linux, menjalankan pekerjaan dengan
nohup
secara otomatis menutup inputnya juga. Pada sistem lain, terutama BSD dan macOS, itu tidak terjadi, jadi ketika berjalan di latar belakang, Anda mungkin ingin menutup input secara manual. Sementara menutup input tidak berpengaruh pada pembuatan atau tidaknohup.out
, itu menghindari masalah lain: jika proses latar belakang mencoba membaca apa pun dari input standar, itu akan berhenti, menunggu Anda untuk membawanya kembali ke latar depan dan mengetik sesuatu. Jadi versi ekstra amannya seperti ini:Namun, perhatikan bahwa ini tidak menghalangi perintah untuk mengakses terminal secara langsung, juga tidak menghapusnya dari grup proses shell Anda. Jika Anda ingin melakukan yang terakhir, dan Anda menjalankan bash, ksh, atau zsh, Anda dapat melakukannya dengan menjalankan
disown
tanpa argumen sebagai perintah berikutnya. Itu berarti proses latar belakang tidak lagi terkait dengan "pekerjaan" shell dan tidak akan ada sinyal yang diteruskan dari shell. (Perhatikan perbedaannya:disown
proses ed tidak mendapat sinyal yang diteruskan secara otomatis oleh shell induknya - tetapi tanpanohup
, itu akan tetap menerimaHUP
sinyal yang dikirim melalui cara lain, sepertikill
perintah manual .nohup
Proses ed mengabaikan semua dan semuaHUP
sinyal, tidak peduli bagaimana mereka dikirim.)Penjelasan:
Dalam sistem Unixy, setiap sumber input atau target output memiliki nomor yang terkait dengannya yang disebut "file descriptor", atau "fd" singkatnya. Setiap program yang berjalan ("proses") memiliki set-nya sendiri, dan ketika sebuah proses baru dimulai, ia memiliki tiga di antaranya sudah terbuka: "input standar", yaitu fd 0, terbuka untuk proses membaca, sementara "output standar" (fd 1) dan "standard error" (fd 2) terbuka untuk ditulisi. Jika Anda hanya menjalankan perintah di jendela terminal, maka secara default, apa pun yang Anda ketik masuk ke input standarnya, sementara output standar dan kesalahan standar dikirim ke jendela itu.
Tetapi Anda dapat meminta shell untuk mengubah di mana salah satu atau semua deskriptor file menunjuk sebelum meluncurkan perintah; itulah yang pengalihan (
<
,<<
,>
,>>
) dan pipa (|
) operator melakukan.Pipa adalah yang paling sederhana dari ini ...
command1 | command2
mengatur output standarcommand1
untuk dimasukkan langsung ke input standarcommand2
. Ini adalah pengaturan yang sangat praktis yang telah mengarah ke pola desain tertentu di alat UNIX (dan menjelaskan adanya kesalahan standar, yang memungkinkan program untuk mengirim pesan kepada pengguna meskipun hasilnya akan masuk ke program berikutnya dalam pipa) . Tetapi Anda hanya dapat menyalurkan output standar ke input standar; Anda tidak dapat mengirim deskriptor file lain ke pipa tanpa juggling.Operator pengalihan lebih ramah karena mereka memungkinkan Anda menentukan deskriptor file mana yang akan diarahkan. Jadi
0<infile
membaca input standar dari file bernamainfile
, sementara2>>logfile
menambahkan kesalahan standar ke akhir file bernamalogfile
. Jika Anda tidak menentukan angka, maka input redirection default ke fd 0 (<
sama dengan0<
), sedangkan output redirection default ke fd 1 (>
sama dengan1>
).Anda juga dapat menggabungkan deskriptor file bersama-sama:
2>&1
berarti "kirim kesalahan standar ke mana pun output standar berjalan". Itu berarti bahwa Anda mendapatkan aliran tunggal output yang mencakup standard out dan standard error yang dicampur dengan tidak ada cara untuk memisahkan mereka lagi, tetapi itu juga berarti bahwa Anda dapat memasukkan standard error dalam pipa.Jadi urutannya
>/dev/null 2>&1
berarti "kirim output standar ke/dev/null
" (yang merupakan perangkat khusus yang hanya membuang apa pun yang Anda tulis ke sana) "dan kemudian mengirim kesalahan standar ke mana pun output standar" (yang baru saja kami pastikan/dev/null
). Pada dasarnya, "buang apa pun yang ditulis perintah ini ke salah satu deskriptor file".Ketika
nohup
mendeteksi bahwa tidak ada kesalahan standar atau output terpasang ke terminal, itu tidak repot untuk membuatnohup.out
, tetapi mengasumsikan bahwa output sudah diarahkan ke mana pengguna ingin pergi.The
/dev/null
perangkat bekerja untuk input, juga; jika Anda menjalankan perintah dengan</dev/null
, maka setiap upaya dengan perintah itu untuk membaca dari input standar akan langsung menemui akhir file. Perhatikan bahwa sintaks gabungan tidak akan memiliki efek yang sama di sini; ini hanya berfungsi untuk mengarahkan deskriptor file ke file lain yang terbuka dengan arah yang sama (input atau output). Shell akan membiarkan Anda melakukannya>/dev/null <&1
, tetapi yang akhirnya membuat proses dengan deskriptor file input terbuka pada aliran output, jadi alih-alih hanya memukul akhir file, setiap upaya membaca akan memicu kesalahan fatal "deskriptor file tidak sah".sumber
nohup
, "jika proses nanti mencoba membaca apa pun dari input standar, itu akan berhenti, menunggu Anda untuk membawanya kembali ke latar depan dan mengetik sesuatu." sepertinya salah. Sebagai gantinya,nohup
menutup input standar (program tidak akan dapat membaca input apa pun, bahkan jika dijalankan di latar depan. Itu tidak dihentikan, tetapi akan menerima kode kesalahan atau EOF).nohup
tidak tidak masukan dekat standar secara otomatis. Perhatikan bahwanohup
ini bukan shell builtin tetapi utilitas biner.nohup
berbeda untuk linux dan untuk BSD atau OS X?awk
berbeda,sed
berbeda,nohup
berbeda ...</dev/null
? Lihat juga0>/dev/null
unix.stackexchange.com/a/266247Itu semua yang perlu Anda lakukan!
sumber
&
akan membuat Anda tidak perlu menggunakanctrl-c
, jika itu penting bagi Anda.some_command
keluaran, termasuk kesalahan.Sudahkah Anda mencoba mengalihkan ketiga aliran I / O:
sumber
>
/ dev / null bukan </ dev / null?< /dev/null
mengalihkan input standar untuknohup
. Linux tidak memerlukan ini tetapi POSIX memungkinkan perilaku di mananohup
tidak dapat berjalan di latar belakang jika input standar terhubung ke terminal. Contoh dari sistem tersebut adalah BSD dan OS X.Anda mungkin ingin menggunakan program detach . Anda menggunakannya seperti
nohup
tetapi tidak menghasilkan log keluaran kecuali Anda menyuruhnya. Ini halaman manualnya:Catatan Saya tidak memiliki afiliasi dengan pembuat program. Saya hanya pengguna yang puas dari program ini.
sumber
Perintah berikut akan memungkinkan Anda menjalankan sesuatu di latar belakang tanpa mendapatkan nohup.out:
Dengan cara ini, Anda akan bisa mendapatkan output konsol saat menjalankan skrip di server jarak jauh:
sumber
Mengarahkan kembali output sudo menyebabkan sudo meminta kembali kata sandi, oleh karena itu diperlukan mekanisme yang canggung untuk melakukan varian ini.
sumber
Jika Anda memiliki BASH shell di mac / linux di depan Anda, Anda mencoba langkah-langkah di bawah ini untuk memahami pengalihan secara praktis:
Buat skrip 2 baris yang disebut zz.sh
Saat ini, hanya menjalankan skrip mengirim STDOUT dan STDERR ke layar.
Sekarang mulailah dengan pengalihan standar:
Di atas, "echo" (STDOUT) masuk ke zfile.txt. Sedangkan "kesalahan" (STDERR) ditampilkan di layar.
Di atas sama dengan:
Sekarang Anda dapat mencoba yang sebaliknya, dan mengarahkan ulang "kesalahan" STDERR ke file. Perintah STDOUT dari "echo" menuju ke layar.
Menggabungkan dua di atas, Anda mendapatkan:
Penjelasan:
Akhirnya, Anda dapat mengemas semuanya di dalam perintah nohup & menjalankannya di latar belakang:
sumber
Anda dapat menjalankan perintah di bawah ini.
misal saya punya perintah nohup di dalam skrip
sumber