bash スクリプトでは、次のように openvpn をクライアントとして起動しています。
#!/bin/bash
conf_file=/etc/openvpn/blahblah.conf
openvpn_pid_file="/var/run/openvpn-client/ovpnc.pid"
command_line="/usr/bin/openvpn --config $conf_file --daemon"
$command_line
openvpn_pid=$!
echo "openvpn_pid=$openvpn_pid"
echo $openvpn_pid >> "$openvpn_pid_file"
openvpn が正常に起動した後、変数 openvpn_pid は空で、openvpn_pid_file も空です。ただし、pgrep openvpn
PID は表示されます。スクリプトでその PID が取得されないのはなぜですか? 変数に正しい PID を取得し、最終的に openvpn_pid_file に取り込むには、何を変更すればよいですか?
これらはすべて Arch Linux 上で行われます。
答え1
からman bash
:
! Expands to the process ID of the job most recently placed into the background, whether executed as an asynchronous command or using the bg builtin
言い換えると、$!
プロセスがバックグラウンドにある場合にのみ値が含まれます。プロセスをバックグラウンドにしていないため殻からは$!
空なので、openvpn_pid
空です。
解決策については、Sven のコメントに記載されています。
はどうかと言うと