运行 expect 脚本后台节点
Running node in background from expect script
我正在尝试从 expect 脚本 运行 多个节点服务,因此为了 运行 它们一个接一个,我需要在后台 运行 它们。 运行 它在控制台中运行良好(进程已启动并在后台启动),例如:
>node /path/to/service1/myService1.js &> /var/log/myService1.log &
>node /path/to/service2/myService2.js &> /var/log/myService2.log &
但是 运行我的 expect 脚本,就像:
#!/usr/bin/expect
set customer_root_dir "/path"
set customer_app_dir "/to"
set services {"service1" "service2"}
set service_names {"myService1" "myService2"}
# Set the maximum match length
match_max [ expr 32 * 1024 ]
foreach service $services service_name $service_names {
spawn node $customer_root_dir/$customer_app_dir/$service/$service_name.js &> /var/log/$service_name.log &
sleep 2
}
puts "All services are running!"
我看到它们不是在后台启动的。服务文件(例如 service1.js
)之后的所有内容(例如 service1.js
),我的意思是 &> /var/log/myService1.log &
,都被忽略了!如果我输入类似 spawn node $customer_root_dir/$customer_app_dir/$service/$service_name.js abracadabra
的内容,期望脚本会 运行 它就像 spawn node $customer_root_dir/$customer_app_dir/$service/$service_name.js
我尝试了什么?
- 我尝试用
exec
替换 spawn
- 我试过
send "pawn node $customer_root_dir/$customer_app_dir/$service/$service_name.js &> /var/log/$service_name.log &\r"
但还是不行。
- 我也试过
nohup
但进程没有启动并且 /var/log
不包含我的日志文件。
我该如何解决我的问题?
这应该有效:
set js $customer_root_dir/$customer_app_dir/$service/$service_name.js
set log /var/log/$service_name.log
exec nohup node $js < /dev/null >& $log &
请注意,将 stdout 和 stderr 写入文件的 Tcl 重定向是 >&
(参见 exec 手册页)。同时重定向所有 stdio 通道以断开与终端的连接。
spawn
不是正确的命令:您不需要与进程交互,所以只需 exec
它并忘记它。
我正在尝试从 expect 脚本 运行 多个节点服务,因此为了 运行 它们一个接一个,我需要在后台 运行 它们。 运行 它在控制台中运行良好(进程已启动并在后台启动),例如:
>node /path/to/service1/myService1.js &> /var/log/myService1.log &
>node /path/to/service2/myService2.js &> /var/log/myService2.log &
但是 运行我的 expect 脚本,就像:
#!/usr/bin/expect
set customer_root_dir "/path"
set customer_app_dir "/to"
set services {"service1" "service2"}
set service_names {"myService1" "myService2"}
# Set the maximum match length
match_max [ expr 32 * 1024 ]
foreach service $services service_name $service_names {
spawn node $customer_root_dir/$customer_app_dir/$service/$service_name.js &> /var/log/$service_name.log &
sleep 2
}
puts "All services are running!"
我看到它们不是在后台启动的。服务文件(例如 service1.js
)之后的所有内容(例如 service1.js
),我的意思是 &> /var/log/myService1.log &
,都被忽略了!如果我输入类似 spawn node $customer_root_dir/$customer_app_dir/$service/$service_name.js abracadabra
的内容,期望脚本会 运行 它就像 spawn node $customer_root_dir/$customer_app_dir/$service/$service_name.js
我尝试了什么?
- 我尝试用
exec
替换spawn
- 我试过
send "pawn node $customer_root_dir/$customer_app_dir/$service/$service_name.js &> /var/log/$service_name.log &\r"
但还是不行。 - 我也试过
nohup
但进程没有启动并且/var/log
不包含我的日志文件。
我该如何解决我的问题?
这应该有效:
set js $customer_root_dir/$customer_app_dir/$service/$service_name.js
set log /var/log/$service_name.log
exec nohup node $js < /dev/null >& $log &
请注意,将 stdout 和 stderr 写入文件的 Tcl 重定向是 >&
(参见 exec 手册页)。同时重定向所有 stdio 通道以断开与终端的连接。
spawn
不是正确的命令:您不需要与进程交互,所以只需 exec
它并忘记它。