test.sh
ルートディレクトリのディスク使用量を表示する次の単純なbashスクリプト(と呼ばれる)があります。sudo
すべてのディレクトリを一覧表示する必要があります(sudo
パスワードを入力する必要はありません)。
#!/bin/bash
sudo du -h --max-depth=1 / 2> /dev/null
ディレクトリが私のパスにあり、次のスクリプトを実行します(出力をテキストファイルに出力するため)。
$ ./test.sh >> ./test.txt
Ctrl+pauseで作業すると、次のような結果がZ得られます。
^Z
[1]+ Stopped ./test.sh >> ./test.txt
その後、バックグラウンドで再起動すると、次の結果bg
が表示されます。
$ bg
[1]+ ./test.sh >> ./test.txt &
[1]+ Stopped ./test.sh >> ./test.txt
$ jobs
[1]+ Stopped ./test.sh >> ./test.txt
(追加試行のbg
ため、実際に2〜3回試行した後、バックグラウンドでスクリプトが再起動される可能性がありますが、これは散発的なようです...)
ただし、 continue を使用すると、スクリプトfg
はフォアグラウンドで実行されます。
$ fg
./test.sh >> ./test.txt
結果は次のように書き込まれますtest.txt
。
3.8M /root
4.0K /authentic-theme
4.0K /srv
72K /tmp
3.2G /snap
4.0K /media
8.4M /etc
0 /proc
0 /sys
4.0K /cdrom
16K /opt
16K /lost+found
24K /dev
4.3M /run
263G /mnt
14M /home
19G /var
245M /boot
3.8G /usr
297G /
スクリプトを次のように変更すると、いいえsudo
代わりにrunスクリプトを使用すると、Normalsudo
を使用してバックグラウンドで再起動しbg
てスクリプトを実行できます。
$ sudo ./test.sh >> ./test.txt
^Z
[1]+ Stopped sudo ./test.sh >> ./test.txt
$ bg
[1]+ sudo ./test.sh >> ./test.txt &
$ jobs
[1]+ Running sudo ./test.sh >> ./test.txt &
以下を使用してコマンド全体を実行すると、sudo
同じことが起こります。
$ sudo du -h --max-depth=1 / 2> /dev/null >> ./test.txt
^Z
[1]+ Stopped sudo du -h --max-depth=1 / 2> /dev/null >> ./test.txt
$ bg
[1]+ sudo du -h --max-depth=1 / 2> /dev/null >> ./test.txt &
$ jobs
[1]+ Running sudo du -h --max-depth=1 / 2> /dev/null >> ./test.txt &
何が起こっているのかを説明できる人はいますか?sudo
コマンドとスクリプトを使用してバックグラウンドで再開できますが、スクリプトにまったく同じコマンドを使用するコマンドが含まれていると、バックグラウンド再開がsudo
明らかbg
に機能しないのはなぜですか?
私はUbuntu 22.04.1を使用しており、デフォルトのBashバージョンは5.1.16です。
編集#1:コマンドが別のエイリアスを有効にしたことを知らせることができますalias sudo='sudo '
。sudo
ただし、このエイリアスを使用または使用せずにテストしたところ、すべてのbg
場合に同じ不規則な回復動作が発生しました。 *
編集#2: jobs -l
次の一般的な情報を提供します。
jobs -l
[1]+ 1074808 Stopped ./test.sh >> ./test.txt
編集#3:私は通常で実行しますtmux
が、なしでテストしましたが、tmux
問題は持続します。
編集#4:SuperMicroサーバーに加えて、ラップトップ(Aorus X5)でテストするためのRaspberry PiとUbuntu VMもあります。これは本当に奇妙です:
- 私のUbuntu VM(Windows 10のVMWare)にこの問題があります。確かにみんなに起こります。すべての場合において、
bg
最初は正しく修復されます。 - 私のRaspberry Piで問題が解決しません。通常、
bg
正しく回復するには2〜3回の試みが必要です。
仮想マシンではなく、メインサーバーとRaspberry Piで実行されているソフトウェアをテストする必要があると思い始めました。
編集#5:stty -tostop
残念ながら、スクリプトを実行する前に設定しても問題は解決しません。ほとんどの場合、正しく回復するにはまだ2〜3回の試みが必要です。最初の試みに成功した場合も何度もありましたが、どんなものよりも良い機会だと思います。
編集#6:私のRaspberry Piで実行されるサービスは次のとおりです。
$ systemctl --type=service --state=running
UNIT LOAD ACTIVE SUB DESCRIPTION
atd.service loaded active running Deferred execution scheduler
containerd.service loaded active running containerd container runtime
cron.service loaded active running Regular background program processing daemon
dbus.service loaded active running D-Bus System Message Bus
docker.service loaded active running Docker Application Container Engine
[email protected] loaded active running Getty on tty1
irqbalance.service loaded active running irqbalance daemon
ModemManager.service loaded active running Modem Manager
networkd-dispatcher.service loaded active running Dispatcher daemon for systemd-networkd
packagekit.service loaded active running PackageKit Daemon
polkit.service loaded active running Authorization Manager
prometheus-node-exporter.service loaded active running Prometheus exporter for machine metrics
rsyslog.service loaded active running System Logging Service
[email protected] loaded active running Serial Getty on ttyS0
smartmontools.service loaded active running Self Monitoring and Reporting Technology (SMART) Daemon
snapd.service loaded active running Snap Daemon
ssh.service loaded active running OpenBSD Secure Shell server
systemd-journald.service loaded active running Journal Service
systemd-logind.service loaded active running User Login Management
systemd-networkd.service loaded active running Network Configuration
systemd-timesyncd.service loaded active running Network Time Synchronization
systemd-udevd.service loaded active running Rule-based Manager for Device Events and Files
udisks2.service loaded active running Disk Manager
unattended-upgrades.service loaded active running Unattended Upgrades Shutdown
unbound.service loaded active running Unbound DNS server
[email protected] loaded active running User Manager for UID 1000
LOAD = Reflects whether the unit definition was properly loaded.
ACTIVE = The high-level unit activation state, i.e. generalization of SUB.
SUB = The low-level unit activation state, values depend on unit type.
26 loaded units listed.
私はこれが私がインストールしてアクティブにしたと思います(そしてSuperMicroとRaspberry Piで実行されます):
containerd.service loaded active running containerd container runtime
docker.service loaded active running Docker Application Container Engine
prometheus-node-exporter.service loaded active running Prometheus exporter for machine metrics
smartmontools.service loaded active running Self Monitoring and Reporting Technology (SMART) Daemon
unbound.service loaded active running Unbound DNS server
テストする事項:
sudo
設定を確認してNOPASSWD
影響があるかどうかを確認してください。- SuperMicroサーバーとRaspberry Piの間に共通にインストールされているサービスを無効にします。
答え1
通常、プログラムがバックグラウンドで実行を拒否するのは、入力が必要なためです。実際には標準入力からは読み
ませんが、df
まだ開いています。努力する:
#!/bin/bash
sudo du -h --max-depth=1 / 2> /dev/null 0< /dev/null
これにより、パスワードを入力できなくなる可能性があります。
あるいは、関連する信号をプロセスに送信しようとすることはそうでないため、問題になる可能性があります。それは疑問ですが、その場合は、まずバックグラウンドで実行することをお勧めします。 (これは私にとって問題ではありません。)