我正在尝试从expect脚本运行多个节点服务,因此要逐个运行它们,我需要在后台运行它们。从控制台运行它工作正常(进程已启动并在后台启动),如:
devise :database_authenticatable, :registerable, :confirmable,
:recoverable, :rememberable, :trackable, :validatable
但运行我的期望脚本,就像:
>node /path/to/service1/myService1.js &> /var/log/myService1.log &
>node /path/to/service2/myService2.js &> /var/log/myService2.log &
我看到它们不是在后台启动..所有在服务文件之后的内容(例如#!/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
,都被忽略了!如果我输入类似&> /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
替换为spawn
exec
但仍然没有运气。 send "pawn node $customer_root_dir/$customer_app_dir/$service/$service_name.js &> /var/log/$service_name.log &\r"
,但流程没有启动,nohup
也没有包含我的日志文件。如何解决我的问题?
答案 0 :(得分:3)
这应该有效:
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
并忘记它。