Saya meluncurkan skrip yang jauh melalui SSH seperti ini:
ssh user@ipaddress '~/my_script.sh'
Semuanya baik-baik saja tetapi setelah skrip selesai, koneksi tidak ditutup. Saya Harus menekan CTRL-C untuk memutuskan koneksi saat ini.
Saya sudah mencoba perintah "keluar" di '~ / my_script.sh' dan tidak berguna. Saya sudah mencoba perintah "logout" di '~ / my_script.sh' dan saya mendapat pesan:
logout: not login shell: use exit
...
Adakah yang bisa saya lakukan untuk menutup SSH secara otomatis dan benar setelah skrip selesai?
(Modifikasi untuk klarifikasi :) Inilah yang ada di dalam skrip saya:
#!/bin/sh
path_sources_qas=/sources/QuickAddress/
path_qas_bin=/usr/bin/qas
umount_disque_qas()
{
# Umount du disque 'qas' s'il n'avait pas été 'umount' :
nom_disque_monte=`cat /etc/mtab | grep qas | awk '{ print $2}'`
if [ "$nom_disque_monte" != "" ]
then
echo "For safety, umount : $nom_disque_monte"
umount $nom_disque_monte
fi
}
# Umount twice (we never know if a st***d guy mounted it twice) :
umount_disque_qas
umount_disque_qas
echo "--------------------------------"
echo "Install ISO quick address..."
nom_fichier_iso=`ls -t $path_sources_qas | awk '{if (NR==1) {print $1}}'`
echo "Mount disk $nom_fichier_iso..."
mount -o loop -t iso9660 $path_sources_qas/$nom_fichier_iso /mnt/qas
echo "Done."
# All the folders are like this :
# /usr/bin/qas/Data.old.10
# /usr/bin/qas/Data.old.11
# /usr/bin/qas/Data.old.12
# ...
echo "--------------------------------"
echo "Stopping QuickAdress server..."
cd $path_qas_bin/apps/
./wvmgmtd shutdown qaserver:2021
sleep 3
echo "Done."
# Get last number of the folder:
num_dernier_dossier_backup=`ls -Atd $path_qas_bin/Data.old* | awk '{if (NR==1) {print $1}}' | awk -F . '{print $NF}'`
# Add 1 :
let "num_dernier_dossier_backup += 1"
# Full name :
nom_dossier_backup=Data.old.$num_dernier_dossier_backup
echo "--------------------------------"
echo "Saving Data to $nom_dossier_backup..."
cd $path_qas_bin
mv Data $nom_dossier_backup
echo "Done."
echo "--------------------------------"
echo "Copying new folder Data..."
cd $path_qas_bin
cp -r /mnt/qas/Data .
echo "Done."
echo "--------------------------------"
echo "Deleting unused datas..."
cd $path_qas_bin/apps/
rm -f $path_qas_bin/Data/frxmos.dap
echo "Done."
echo "--------------------------------"
echo "Restart server..."
cd $path_qas_bin/apps/
./qaswvd &
sleep 3
echo "Done."
sleep 3
echo "--------------------------------"
echo "Check: server state: you should read 'OK':"
./wvmgmtd srvlist
echo "Done."
echo "--------------------------------"
echo "Check: active licences (only one here):"
./wvmgmtd licencelistread qaserver:2021
echo "Done."
echo "--------------------------------"
echo "Check: counters: number of addresses left:"
./wvmgmtd counterinforead qaserver:2021
echo "Done."
echo "--------------------------------"
echo "Check: Datasets avalaibles:"
./wvmgmtd datalistread current qaserver:2021
echo "Done."
echo "--------------------------------"
echo "Check: "meters" for "licence by click":"
./wvmgmtd meterslistread current qaserver:2021
echo "Done."
echo "--------------------------------"
echo "Removing virtual disk..."
umount_disque_qas
echo "Done."
echo "All done"
echo "Click 'Ctrl-C' to quit."
exit
Ketika saya meluncurkannya melalui SSH, itu berjalan dan pada akhirnya, saya membaca "Semua selesai." jadi ini berarti mencapai 2 baris terakhir .
Tahu bagaimana saya bisa melakukan untuk menutup secara otomatis dan pr
bash
ssh
shell-script
Olivier Pons
sumber
sumber
~/.ssh/config
, coba tanpanya, dan berikan opsi-a -x
(dan tidak-o
) untukssh
memastikan tidak ada penerusan yang sedang berlangsung. Jika masih tidak berfungsi, perlihatkan konten skrip.ssh <yourusername>@localhost '(ls; sleep 10 &); echo Done; jobs'
akan membuat daftar file, menampilkan selesai dan menunggu 10 detik sebelum kembali.Jawaban:
Keluar di skrip shell tidak berfungsi karena keluar dari skrip, bukan shell. Untuk keluar dari shell setelah script selesai dilakukan
Ini akan menjalankan skrip kemudian keluar dari shell.
sumber
sshd
dan shell berjalanmyscript.sh
. Theexit
Anda tulis akan bertindak ketika keluar script, yang tidak membantu. Satu-satunya cara solusi Anda bisa bekerja adalah jika skrip melakukan sesuatu yang aneh ketika orang tuanya adalahsshd
dan tidak melakukan hal yang aneh ketika orang tuanya adalah sebuah shell.~/my_script.sh && exit
keluar segera setelah~/my_script.sh
keluar. Jika skrip shell tidak keluar, perintah Anda tidak akan pernah berhasilexit
sedikit pun. Jadi tidak ada gunanya.Sambungan ssh tetap terbuka saat proses dimulai dengan ssh (di sini, shell) keluar, jika ada proses lain yang masih menggunakannya. Saya tidak tahu aturan pasti yang mengikuti daemon ssh, tetapi koneksi sedang digunakan, setidaknya, jika output standar dari setiap proses anak masih terhubung ke pipa asli yang disediakan oleh ssh. Membandingkan:
Ketika Anda memulai daemon, Anda harus latar belakangnya dan tutup deskriptor file-nya. Setidaknya, gunakan ini:
Anda mungkin ingin menambahkan
nohup
di depan; itu tidak akan membuat perbedaan di sini tetapi akan berguna jika skrip dijalankan dari terminal. Banyak program yang dirancang untuk bertindak sebagai daemon memiliki opsi baris perintah untuk membuat mereka melakukan fork, menutup deskriptor file, mengabaikan sinyal dan basa-basi lainnya. Periksa diqaswvd
dokumentasi jika ada. Anda juga dapat menyelidiki utilitas "daemonizer".sumber
Saya melihat posting ini ketika saya mencari solusi untuk situasi yang sama. Meskipun agak terlambat untuk menyelesaikan masalah @ Oliver, karena jawaban yang diterima jelas tidak berfungsi baik untuk OP atau saya (tidak tahu mengapa itu diterima), saya masih ingin memposting solusi saya sendiri untuk googler masa depan. Sederhana: tambahkan
-f
opsi dalamssh
perintah:EDIT
Efek dari
-f
opsi adalah untuk diletakkanssh
di latar belakang, jadi tanpa opsi lebih lanjut ditambahkan adalah mungkin bahwa koneksi masih hidup bahkan tampaknya itu rusak. Seseorang dapat merujuk ke jawaban yang diberikan dalam posting lain di situs ini jika tertarik.sumber
Seperti Ignacio, saya ingin tahu apa yang ada di naskah Anda.
Mungkin Anda bisa mencoba dan mengurangi skrip Anda menjadi contoh sekecil mungkin yang menghasilkan kondisi kesalahan.
Atau mulai dari skrip kosong dan tambahkan perintah pada satu waktu sampai Anda melihat masalahnya, maka Anda akan tahu perintah apa yang menyebabkan skrip Anda terkunci.
Jika skrip kosong menyebabkan Anda mengalami masalah, Anda mungkin ingin menyelidiki konfigurasi ssh Anda, misalnya, apakah .bash_logout atau beberapa yang dipanggil saat keluar yang dapat menyebabkan masalah?
sumber
Anda mungkin menggunakan pekerjaan dalam skrip Anda. Jika itu kasus shell hanya menunggu pekerjaan Anda selesai dan tidak ingin melepaskan diri.
Saya tidak akan memposting ulang, hanya akan meneruskan Anda http://en.wikipedia.org/wiki/Nohup#Existing_jobs
sumber
nohup
tidak secara langsung masalah di sini karena tidak ada terminal di sisi server: Saya pikir pelakunya secara khusus adalah deskriptor file terbuka.Anda harus membunuh proses orang tua dari dalam skrip Anda.
kill -SIGHUP $PPID
sumber
Masalahnya kemungkinan adalah baris berikut.
Perintah ini mungkin masih berjalan dan akan membuat pipa ssh terbuka sampai stdin dan stdout & stderr ditutup.
Gunakan ini sebagai gantinya:
sumber