SSHして外部からラズパイ内部でたたいたコマンドは実行中にSSHが切断されると終了する
SSHしているラズパイで,時間のかかるプロセスをSSHもと(PCのTeraTermのコンソールとか)から実行中にSSHが切れてしまうと,ラズパイがローカルだけで実行できるプログラムであっても実行していたプロセスが終了してしまう.
- 例:ラズパイのローカルのみで完結する,1時間回し続けるプログラムをSSHで実行していたが,ネットワークが不安定だったため,実行中にSSHが途絶えた.途絶えた時点でラズパイの中のプロセスも終了した
でも実験のデータは確実にとりたいのでネットワークが切れてもラズパイ内部ではプログラムを実行し続けてほしい
sshが何らかの理由で途絶えたとしてもラズパイ側で動いているプロセスを生きてほしい.
そんな時は nohup
コマンドを使う.
- 記号なしリストnohupコマンドは実行したいコマンドの前につけることでその実行によって動くプロセスはSSHもとのアクションを受け付けなくなる(SSHが切れても終了しなくなる)
- 当然Ctrl+Cなどでの強制終了も効かなくなるため,
kill
コマンドでプロセスを直接殺す必要がある - 標準出力もキャンセルされてしまうため,実行中のプログラムの動作状況は確認しづらい
- 例えば,
nohup ls
と実行しても何も表示されない - 実行中はそのコンソールには何も出力されないのでコマンドは末尾に
&
を付けてバックグラウンドで実行することを強くお勧めする - 標準出力はnohup.outというファイルの中に書き込まれている
- プログラムの実行中は
tail nohup.out
などを実行して出力状況を確認することができる
- 例えば,
例:$ nohup python3 hogehoge.py &
プログラムを停止させるときはps -x
コマンドでプロセスを確認
$ ps -x
PID TTY STAT TIME COMMAND
508 ? Ss 0:00 /lib/systemd/systemd --user
511 ? S 0:00 (sd-pam)
516 ? Ssl 0:16 /usr/bin/lxsession -s LXDE-pi -e LXDE
525 ? Ss 0:00 /usr/bin/dbus-daemon --session --address=systemd: --nofork --nopidfile --systemd-activation
566 ? Ss 0:04 /usr/bin/ssh-agent x-session-manager
573 ? Ssl 0:00 /usr/lib/gvfs/gvfsd
578 ? Sl 0:00 /usr/lib/gvfs/gvfsd-fuse /run/user/1000/gvfs -f -o big_writes
588 ? S 0:01 openbox --config-file /home/pi/.config/openbox/lxde-pi-rc.xml
591 ? Sl 0:00 lxpolkit
599 ? Sl 62:18 lxpanel --profile LXDE-pi
601 ? Sl 0:03 pcmanfm --desktop --profile LXDE-pi
629 ? Ss 0:00 /usr/bin/ssh-agent -s
658 ? S 0:07 /usr/bin/vncserverui service 15
672 ? S 0:01 /usr/bin/vncserverui -statusicon 7
675 ? Ssl 0:00 /usr/lib/menu-cache/menu-cached /run/user/1000/menu-cached-:0
683 ? Z 0:00 [sh] <defunct>
691 ? Ssl 0:00 /usr/lib/gvfs/gvfs-udisks2-volume-monitor
701 ? Ssl 0:00 /usr/lib/gvfs/gvfs-mtp-volume-monitor
705 ? Ssl 0:00 /usr/lib/gvfs/gvfs-gphoto2-volume-monitor
709 ? Ssl 0:00 /usr/lib/gvfs/gvfs-goa-volume-monitor
713 ? Ssl 0:00 /usr/lib/gvfs/gvfs-afc-volume-monitor
751 ? Sl 0:00 /usr/lib/gvfs/gvfsd-trash --spawner :1.4 /org/gtk/gvfs/exec_spaw/0
1300 ? S 0:14 sshd: pi@pts/0
1303 pts/0 Ss 0:00 -bash
1834 ? S 0:00 sshd: pi@pts/2
1837 pts/2 Ss 0:00 -bash
1952 pts/0 R+ 0:30 python3 hogehoge.py //該当のプロセス
1953 pts/2 R+ 0:00 ps -x
17807 ? Sl 0:24 lxterminal
17808 ? S 0:00 gnome-pty-helper
17809 pts/1 Ss+ 0:00 bash
24536 ? S 0:02 sshd: pi@notty
24538 ? Ss 0:00 /usr/lib/openssh/sftp-server
該当のプロセスのプロセスID(PID)を指定してプロセスを削除する
kill 1952