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?

Ofer
sumber

Jawaban:

612

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.

 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 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:

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 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".

Mark Reed
sumber
1
Mengenai 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).
Tim
1
@ 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 ...
Mark Reed
Mengapa Anda menulis "ekstra aman" </dev/null? Lihat juga 0>/dev/null unix.stackexchange.com/a/266247
Tim
68
nohup some_command > /dev/null 2>&1&

Itu semua yang perlu Anda lakukan!

11101101b
sumber
4
Ada jawaban lain yang hampir memiliki hal yang sama, tetapi pada akhirnya tidak ada "&" ekstra.
11101101b
10
Itu &akan membuat Anda tidak perlu menggunakan ctrl-c, jika itu penting bagi Anda.
SunSparc
1
Kemampuan untuk berlari di BG sangat membantu
ist_lion
Ini hanya berguna jika Anda tidak repot-repot menangkap some_commandkeluaran, termasuk kesalahan.
wulfgarpro
12

Sudahkah Anda mencoba mengalihkan ketiga aliran I / O:

nohup ./yourprogram > foo.out 2> foo.err < /dev/null &
Aziz Shaikh
sumber
1
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.

Dan D.
sumber
2
Tautannya tidak rusak dan git repo sudah tua. Itu tidak termasuk v0.2.3 saat ini.
Dan D.
5

Perintah berikut akan memungkinkan Anda menjalankan sesuatu di latar belakang tanpa mendapatkan nohup.out:

nohup command |tee &

Dengan cara ini, Anda akan bisa mendapatkan output konsol saat menjalankan skrip di server jarak jauh: masukkan deskripsi gambar di sini

Ikan badut
sumber
4
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.

Kjeld Flarup
sumber
1

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
  • Output perintah echo masuk ke STDOUT filestream (file descriptor 1).
  • Output perintah kesalahan masuk ke STDERR filestream (file descriptor 2)

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:

  • PERTAMA, kirim STDOUT 1 ke zfile.txt
  • LALU, kirim STDERR 2 ke STDOUT 1 sendiri (dengan menggunakan & 1 pointer).
  • Karenanya, 1 dan 2 masuk ke file yang sama (zfile.txt)

Akhirnya, Anda dapat mengemas semuanya di dalam perintah nohup & menjalankannya di latar belakang:

nohup zz.sh 1> zfile.txt 2>&1&
Thyag
sumber
1

Anda dapat menjalankan perintah di bawah ini.

nohup <your command> & >  <outputfile> 2>&1 &

misal saya punya perintah nohup di dalam skrip

./Runjob.sh > sparkConcuurent.out 2>&1
Prem S
sumber