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?
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?
Jawaban:
The nohup
perintah saja menulis ke nohup.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.
nohup command >/dev/null 2>&1 # doesn't create nohup.out
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 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 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:
nohup command </dev/null >/dev/null 2>&1 & # completely detached from terminal
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 tanpa nohup
, itu akan tetap menerima HUP
sinyal yang dikirim melalui cara lain, seperti kill
perintah manual . nohup
Proses ed mengabaikan semua dan semua HUP
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 standar command1
untuk 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<infile
membaca input standar dari file bernama infile
, sementara 2>>logfile
menambahkan 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>&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 membuat nohup.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".
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 bahwa nohup
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 juga 0>/dev/null
unix.stackexchange.com/a/266247
nohup some_command > /dev/null 2>&1&
Itu semua yang perlu Anda lakukan!
&
akan membuat Anda tidak perlu menggunakan ctrl-c
, jika itu penting bagi Anda.
some_command
keluaran, termasuk kesalahan.
Sudahkah Anda mencoba mengalihkan ketiga aliran I / O:
nohup ./yourprogram > foo.out 2> foo.err < /dev/null &
>
/ dev / null bukan </ dev / null?
< /dev/null
mengalihkan input standar untuk nohup
. Linux tidak memerlukan ini tetapi POSIX memungkinkan perilaku di mana nohup
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:
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.
sudo bash -c "nohup /opt/viptel/viptel_bin/log.sh $* &> /dev/null" &
Mengarahkan kembali output sudo menyebabkan sudo meminta kembali kata sandi, oleh karena itu diperlukan mekanisme yang canggung untuk melakukan varian ini.
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
#!/bin/bash
echo "Hello. This is a proper command"
junk_errorcommand
Saat ini, hanya menjalankan skrip mengirim STDOUT dan STDERR ke layar.
./zz.sh
Sekarang mulailah dengan pengalihan standar:
zz.sh > zfile.txt
Di atas, "echo" (STDOUT) masuk ke zfile.txt. Sedangkan "kesalahan" (STDERR) ditampilkan di layar.
Di atas sama dengan:
zz.sh 1> zfile.txt
Sekarang Anda dapat mencoba yang sebaliknya, dan mengarahkan ulang "kesalahan" STDERR ke file. Perintah STDOUT dari "echo" menuju ke layar.
zz.sh 2> zfile.txt
Menggabungkan dua di atas, Anda mendapatkan:
zz.sh 1> zfile.txt 2>&1
Penjelasan:
Akhirnya, Anda dapat mengemas semuanya di dalam perintah nohup & menjalankannya di latar belakang:
nohup zz.sh 1> zfile.txt 2>&1&