Melakukan perintah jangka panjang pada ssh

10

Saya sshmasuk ke server dan saya memulai skrip Python yang akan memakan waktu sekitar. 24 jam untuk menyelesaikan. Bagaimana jika koneksi internet saya mati di tengah? Apakah itu akan menghentikan perintah?

Apakah ada cara untuk menjalankan perintah saya yang sudah berjalan lama dengan cara yang tidak terputus oleh koneksi lokal dan saya bisa terus melihat hasilnya setelah saya login sshlagi?

Ram Rachum
sumber

Jawaban:

29

Cara terbaik adalah dengan menggunakan screen(pada server) untuk memulai sesi untuk menjalankan perintah dan kemudian lepaskan layar sehingga akan terus berjalan, dan Anda dapat melakukan hal-hal lain, atau cukup lepaskan dari server. Pilihan lainnya adalah menggunakan nohupdalam kombinasi dengan yang &Anda inginkannohup <command> &

Zypher
sumber
Layar. Atau Anda dapat mengatur tugas cron jika itu sesuatu yang Anda jalankan lebih dari sekali.
xeon
2
Jika Anda terputus saat sedang berjalan di layar, screen -rakan menghubungkan Anda kembali.
dpflug
2

Anda juga dapat menggunakan disownjika Anda sudah memulai proses tanpa screenataunohup

Robert Swisher
sumber
2

Jawaban yang ada dapat bekerja dengan baik, tetapi saya membutuhkan sesuatu untuk BusyBox (shell dan seperangkat alat untuk perangkat keras minimal seperti router rumah). Sistem saya tidak memiliki screen, dtach, at, disown, atau bahkan nohup! Jadi terima kasih kepada tbc0 pada SO ( tautan ), saya menemukan permata ini. Segera kembali tetapi proses server terus berjalan:

ssh myserver 'sleep 100 >&- 2>&- <&- &'

Atau, jika diperlukan beberapa perintah:

ssh myserver '(echo one; sleep 100; echo two; sleep 200) >&- 2>&- <&- &'

Penjelasan:

  • >&- - tutup stdout handle
  • 2>&- - tutup stderr
  • <&- - tutup stdin
  • & - Menempatkan proses di latar belakang

Ini tidak menggunakan program eksternal dan harus bekerja di ksh, ash, Bourne shell, bash, dll.

cor
sumber
1

Jika Anda melatar belakangi suatu proses & menutup sesi Anda, proses tersebut akan diadopsi oleh init (PID 1).

Jika saya memiliki sesi dan lakukan:

]$ sleep 10000 &
]$ exit

dan buka sesi lain dan jalankan:

]$ ps -ef | grep sleep
501      26387     1  0 16:37 ?        00:00:00 sleep 10000
root     26422 21360  0 16:40 pts/0    00:00:00 grep sleep

Proses saya masih berjalan, dan kami melihat bahwa proses induknya sekarang 1 (init).

Atau Anda dapat mengatur skrip seperti layaknya daemon. Pencarian cepat menemukan tautan yang tampaknya bermanfaat ini: http://onlamp.com/python/pythoncook2/solution.csp?day=1 . Jika Anda ingin mengambil pendekatan itu.

pengguna51359
sumber