Jalankan perintah nohup melalui SSH, lalu lepaskan

46

Saya ingin menjalankan skrip, start.shpada server jauh yang menjalankan ini:

nohup node server.js &

Secara naif, saya menyebut SSH seperti ini:

ssh myserver <<EOF
./start.sh &
EOF

Ini memulai skrip, tetapi membuat sesi tetap terhubung. Saya ingin mengikuti langkah ini dengan perintah lain dalam sebuah skrip, jadi itu tidak baik.

Bagaimana saya bisa SSH ke mesin jarak jauh, meluncurkan nohupperintah ke latar belakang, lalu lepaskan? Saya kira saya bisa menempatkan proses SSH itu sendiri ke latar belakang, tapi itu sepertinya tidak benar.

Steve Bennett
sumber

Jawaban:

40

Anda telah menemukan cara yang benar, di sini dokumen.

CATATAN : Anda dapat menempatkan ssh (klien) di latar belakang dengan menempatkan & di akhir, tetapi Anda tidak akan melihat hasilnya. Jika Anda benar-benar ingin melakukan ini, arahkan kembali stdout / stderr ke file jika Anda perlu memeriksa respons dari host jarak jauh.

Pada dasarnya Anda bisa melakukannya dengan cara apa pun:

Jalankan perintah {, s} secara langsung

ssh user@host "nohup command1 > /dev/null 2>&1 &; nohup command2; command3"

ATAU

ssh user@host "$(nohup command1 > /dev/null 2>&1 &) && nohup command2 >> /path/to/log 2>&1 &"

CATATAN : &&membutuhkan perintah pertama untuk mengembalikan 0 sebelum menjalankan perintah kedua

Gunakan dokumen Di Sini

ssh user@host << EOF
nohup command1 > /dev/null 2>&1 &
nohup command2 >> /path/to/command2.log 2>&1 &
......
EOF

3 opsi di atas akan bekerja untuk Anda.

Selain itu, lihat jawabannya di sini: https://askubuntu.com/a/348921/70270

Terry Wang
sumber
Terima kasih - jadi sedikit yang saya lewatkan adalah benar - benar > /dev/null.
Steve Bennett
Tidak juga, > /dev/null 2>&1adalah membuang output stdout / stderr dengan mengarahkan kembali ke lubang hitam lol
Terry Wang
5
Perhatikan bahwa saya akan menyarankan menggunakan >> daripada hanya> untuk menulis ke file log. Jika tidak, Anda hanya akan mendapatkan kesalahan dari proses terakhir.
Alexis Wilke
Apakah benar bahwa jika saya hanya memulai perintah seperti nohup command2 >> /path/to/command2.log 2>&1 &di terminal dan kemudian menutup terminal maka prosesnya hilang?
Luke
1
@TerryWang contoh kedua tidak akan bekerja dengan ampersand diikuti oleh double ampersand, lihat unix.stackexchange.com/q/67006/86716
tsionyx
7

Mengapa tidak hanya tmux atau layar dan selesai dengan itu? Sebagai contoh:

$ tmux new -s SessionNameHere
$ nohup /path/to/your/script.sh

Ini praktis jika itu adalah sesuatu yang akan terus berulang atau memakan waktu cukup lama untuk diselesaikan. Anda dapat memutuskan koneksi dari sesi dan itu akan tetap aktif.

Segera
sumber
2
Tidak benar-benar cocok dengan apa yang saya minta, yang merupakan perintah tunggal yang dapat dijalankan di laptop saya, yang akan terhubung, garpu perintah, lalu lepaskan.
Steve Bennett
3
ssh node "nohup sleep 10 &"

tidak berjalan dalam mode daemon, menjaga sesi ssh Anda terhubung. Ssh sesi akan kembali dalam 10 detik, meskipun Anda menggunakan nohup.

Alasannya adalah stdout dan stderr jarak jauh masih terhubung ke sesi Anda. Itu membuat sesi ssh tetap hidup, nohup tidak membantu.

Ini:

ssh node "nohup sleep 10 1>/dev/null 2>/dev/null &"

segera kembali. Itu memulai proses jarak jauh dengan nohup dan segera keluar dari sesi ssh.

Sergey Cherepanov
sumber
Ini persis masalah kita. Kami hanya memiliki 1> file.log. SSH pada satu mesin macet. Proses pada mesin 'simpul' sedang berjalan. Ketika kami menambahkan 2> & 1 tepat sebelum penutupan &, itu membuat ssh terputus.
Lee Meador
2

Bentuk lebih pendek:

ssh host "(command 1; command 2; ...) &>/dev/null &"

Tampaknya, bash itu sendiri melakukan pelepasan dari terminal, jadi tidak perlu nohup. Saya menjalankan Ubuntu 14.04 x86_64, bash 4.3.11.

Alek_A
sumber
1
Ini tidak memberikan jawaban untuk pertanyaan itu. Untuk mengkritik atau meminta klarifikasi dari penulis, tinggalkan komentar di bawah posting mereka - Anda selalu dapat mengomentari posting Anda sendiri, dan setelah Anda memiliki reputasi yang cukup Anda akan dapat mengomentari posting apa pun . - Dari Ulasan
David Foerster
Ini sepertinya tidak berhasil. nohup; hanya menghasilkan keluhan tentang argumen yang hilang.
Steve Bennett
@ DavidFoerster, tidak ada Ide mengapa, jika command 1; command 2; ...mewakili skrip OP ingin dijalankan. OP juga dapat menggunakan kasus khusus dari jawaban ini:ssh myserver ./start.sh &>/dev/null &
Alek_A